From f92ec5ea54d64207f5ffd30b5c746367a6e75dc4 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 29 Dec 2021 12:03:36 -0800 Subject: [PATCH 001/472] change the offset|repcode sumtype format to match offBase directly at ZSTD_storeSeq() interface. In the process, remove ZSTD_REP_MOVE. This makes it possible, in future commits, to update and effectively simplify the naming scheme to properly label the updated processing pipeline : offset | repcode => offBase => offCode + offBits --- lib/compress/zstd_compress_internal.h | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index c406e794b..f71791ec0 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -577,18 +577,17 @@ ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const iend, BYTE con while (ip < iend) *op++ = *ip++; } -#define ZSTD_REP_MOVE (ZSTD_REP_NUM-1) #define STORE_REPCODE_1 STORE_REPCODE(1) #define STORE_REPCODE_2 STORE_REPCODE(2) #define STORE_REPCODE_3 STORE_REPCODE(3) -#define STORE_REPCODE(r) (assert((r)>=1), assert((r)<=3), (r)-1) -#define STORE_OFFSET(o) (assert((o)>0), o + ZSTD_REP_MOVE) -#define STORED_IS_OFFSET(o) ((o) > ZSTD_REP_MOVE) -#define STORED_IS_REPCODE(o) ((o) <= ZSTD_REP_MOVE) -#define STORED_OFFSET(o) (assert(STORED_IS_OFFSET(o)), (o)-ZSTD_REP_MOVE) -#define STORED_REPCODE(o) (assert(STORED_IS_REPCODE(o)), (o)+1) /* returns ID 1,2,3 */ -#define STORED_TO_OFFBASE(o) ((o)+1) -#define OFFBASE_TO_STORED(o) ((o)-1) +#define STORE_REPCODE(r) (assert((r)>=1), assert((r)<=ZSTD_REP_NUM), (r)) /* accepts IDs 1,2,3 */ +#define STORE_OFFSET(o) (assert((o)>0), o + ZSTD_REP_NUM) +#define STORED_IS_OFFSET(o) ((o) > ZSTD_REP_NUM) +#define STORED_IS_REPCODE(o) ( 1 <= (o) && (o) <= ZSTD_REP_NUM) +#define STORED_OFFSET(o) (assert(STORED_IS_OFFSET(o)), (o) - ZSTD_REP_NUM) +#define STORED_REPCODE(o) (assert(STORED_IS_REPCODE(o)), (o)) /* returns ID 1,2,3 */ +#define STORED_TO_OFFBASE(o) (o) +#define OFFBASE_TO_STORED(o) (o) /*! ZSTD_storeSeq() : * Store a sequence (litlen, litPtr, offCode and matchLength) into seqStore_t. From 7a18d709ae5a8ba53c5199adb2e8461cb216fb00 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 29 Dec 2021 17:30:43 -0800 Subject: [PATCH 002/472] updated all names to offBase convention --- lib/compress/zstd_compress.c | 72 ++++++------ lib/compress/zstd_compress_internal.h | 55 +++++---- lib/compress/zstd_compress_superblock.c | 34 +++--- lib/compress/zstd_double_fast.c | 20 ++-- lib/compress/zstd_fast.c | 20 ++-- lib/compress/zstd_lazy.c | 142 ++++++++++++------------ lib/compress/zstd_ldm.c | 2 +- lib/compress/zstd_opt.c | 60 +++++----- tests/decodecorpus.c | 14 +-- tests/fuzzer.c | 3 +- 10 files changed, 214 insertions(+), 208 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index f06456af9..1cb229f7a 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2940,7 +2940,7 @@ static void ZSTD_copyBlockSequences(ZSTD_CCtx* zc) /* seqStoreSeqs[i].offset == offCode+1, and ZSTD_updateRep() expects offCode so we provide seqStoreSeqs[i].offset - 1 */ ZSTD_updateRep(updatedRepcodes.rep, - seqStoreSeqs[i].offBase - 1, + seqStoreSeqs[i].offBase, seqStoreSeqs[i].litLength == 0); literalsRead += outSeqs[i].litLength; } @@ -3433,20 +3433,22 @@ static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore, } /** - * Returns the raw offset represented by the combination of offCode, ll0, and repcode history. - * offCode must represent a repcode in the numeric representation of ZSTD_storeSeq(). + * Returns the raw offset represented by the combination of offBase, ll0, and repcode history. + * offBase must represent a repcode in the numeric representation of ZSTD_storeSeq(). */ static U32 -ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 offCode, const U32 ll0) +ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 offBase, const U32 ll0) { - U32 const adjustedOffCode = STORED_REPCODE(offCode) - 1 + ll0; /* [ 0 - 3 ] */ - assert(STORED_IS_REPCODE(offCode)); - if (adjustedOffCode == ZSTD_REP_NUM) { - /* litlength == 0 and offCode == 2 implies selection of first repcode - 1 */ - assert(rep[0] > 0); + U32 const adjustedRepCode = OFFBASE_TO_REPCODE(offBase) - 1 + ll0; /* [ 0 - 3 ] */ + assert(OFFBASE_IS_REPCODE(offBase)); + if (adjustedRepCode == ZSTD_REP_NUM) { + /* litlength == 0 and offCode == 2 implies selection of first repcode - 1 + * This is only valid if it results in a valid offset value, aka > 0. + */ + assert(rep[0] > 1); return rep[0] - 1; } - return rep[adjustedOffCode]; + return rep[adjustedRepCode]; } /** @@ -3468,11 +3470,11 @@ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_ for (; idx < nbSeq; ++idx) { seqDef* const seq = seqStore->sequencesStart + idx; U32 const ll0 = (seq->litLength == 0); - U32 const offCode = OFFBASE_TO_STORED(seq->offBase); + U32 const offBase = seq->offBase; assert(seq->offBase > 0); - if (STORED_IS_REPCODE(offCode)) { - U32 const dRawOffset = ZSTD_resolveRepcodeToRawOffset(dRepcodes->rep, offCode, ll0); - U32 const cRawOffset = ZSTD_resolveRepcodeToRawOffset(cRepcodes->rep, offCode, ll0); + if (OFFBASE_IS_REPCODE(offBase)) { + U32 const dRawOffset = ZSTD_resolveRepcodeToRawOffset(dRepcodes->rep, offBase, ll0); + U32 const cRawOffset = ZSTD_resolveRepcodeToRawOffset(cRepcodes->rep, offBase, ll0); /* Adjust simulated decompression repcode history if we come across a mismatch. Replace * the repcode with the offset it actually references, determined by the compression * repcode history. @@ -3484,8 +3486,8 @@ static void ZSTD_seqStore_resolveOffCodes(repcodes_t* const dRepcodes, repcodes_ /* Compression repcode history is always updated with values directly from the unmodified seqStore. * Decompression repcode history may use modified seq->offset value taken from compression repcode history. */ - ZSTD_updateRep(dRepcodes->rep, OFFBASE_TO_STORED(seq->offBase), ll0); - ZSTD_updateRep(cRepcodes->rep, offCode, ll0); + ZSTD_updateRep(dRepcodes->rep, seq->offBase, ll0); + ZSTD_updateRep(cRepcodes->rep, offBase, ll0); } } @@ -5770,26 +5772,26 @@ ZSTD_validateSequence(U32 offCode, U32 matchLength, * window size. After output surpasses windowSize, we're limited to windowSize offsets again. */ size_t const offsetBound = posInSrc > windowSize ? (size_t)windowSize : posInSrc + (size_t)dictSize; - RETURN_ERROR_IF(offCode > STORE_OFFSET(offsetBound), corruption_detected, "Offset too large!"); + RETURN_ERROR_IF(offCode > OFFSET_TO_OFFBASE(offsetBound), corruption_detected, "Offset too large!"); RETURN_ERROR_IF(matchLength < MINMATCH, corruption_detected, "Matchlength too small"); return 0; } /* Returns an offset code, given a sequence's raw offset, the ongoing repcode array, and whether litLength == 0 */ -static U32 ZSTD_finalizeOffCode(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 ll0) +static U32 ZSTD_finalizeOffBase(U32 rawOffset, const U32 rep[ZSTD_REP_NUM], U32 ll0) { - U32 offCode = STORE_OFFSET(rawOffset); + U32 offBase = OFFSET_TO_OFFBASE(rawOffset); if (!ll0 && rawOffset == rep[0]) { - offCode = STORE_REPCODE_1; + offBase = REPCODE1_TO_OFFBASE; } else if (rawOffset == rep[1]) { - offCode = STORE_REPCODE(2 - ll0); + offBase = REPCODE_TO_OFFBASE(2 - ll0); } else if (rawOffset == rep[2]) { - offCode = STORE_REPCODE(3 - ll0); + offBase = REPCODE_TO_OFFBASE(3 - ll0); } else if (ll0 && rawOffset == rep[0] - 1) { - offCode = STORE_REPCODE_3; + offBase = REPCODE3_TO_OFFBASE; } - return offCode; + return offBase; } /* Returns 0 on success, and a ZSTD_error otherwise. This function scans through an array of @@ -5819,19 +5821,19 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, U32 const litLength = inSeqs[idx].litLength; U32 const ll0 = (litLength == 0); U32 const matchLength = inSeqs[idx].matchLength; - U32 const offCode = ZSTD_finalizeOffCode(inSeqs[idx].offset, updatedRepcodes.rep, ll0); - ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0); + U32 const offBase = ZSTD_finalizeOffBase(inSeqs[idx].offset, updatedRepcodes.rep, ll0); + ZSTD_updateRep(updatedRepcodes.rep, offBase, ll0); - DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offCode, matchLength, litLength); + DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offBase, matchLength, litLength); if (cctx->appliedParams.validateSequences) { seqPos->posInSrc += litLength + matchLength; - FORWARD_IF_ERROR(ZSTD_validateSequence(offCode, matchLength, seqPos->posInSrc, + FORWARD_IF_ERROR(ZSTD_validateSequence(offBase, matchLength, seqPos->posInSrc, cctx->appliedParams.cParams.windowLog, dictSize), "Sequence validation failed"); } RETURN_ERROR_IF(idx - seqPos->idx > cctx->seqStore.maxNbSeq, memory_allocation, "Not enough memory allocated. Try adjusting ZSTD_c_minMatch."); - ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength); + ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offBase, matchLength); ip += matchLength + litLength; } ZSTD_memcpy(cctx->blockState.nextCBlock->rep, updatedRepcodes.rep, sizeof(repcodes_t)); @@ -5888,7 +5890,7 @@ ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* U32 litLength = currSeq.litLength; U32 matchLength = currSeq.matchLength; U32 const rawOffset = currSeq.offset; - U32 offCode; + U32 offBase; /* Modify the sequence depending on where endPosInSequence lies */ if (endPosInSequence >= currSeq.litLength + currSeq.matchLength) { @@ -5942,20 +5944,20 @@ ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* } /* Check if this offset can be represented with a repcode */ { U32 const ll0 = (litLength == 0); - offCode = ZSTD_finalizeOffCode(rawOffset, updatedRepcodes.rep, ll0); - ZSTD_updateRep(updatedRepcodes.rep, offCode, ll0); + offBase = ZSTD_finalizeOffBase(rawOffset, updatedRepcodes.rep, ll0); + ZSTD_updateRep(updatedRepcodes.rep, offBase, ll0); } if (cctx->appliedParams.validateSequences) { seqPos->posInSrc += litLength + matchLength; - FORWARD_IF_ERROR(ZSTD_validateSequence(offCode, matchLength, seqPos->posInSrc, + FORWARD_IF_ERROR(ZSTD_validateSequence(offBase, matchLength, seqPos->posInSrc, cctx->appliedParams.cParams.windowLog, dictSize), "Sequence validation failed"); } - DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offCode, matchLength, litLength); + DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offBase, matchLength, litLength); RETURN_ERROR_IF(idx - seqPos->idx > cctx->seqStore.maxNbSeq, memory_allocation, "Not enough memory allocated. Try adjusting ZSTD_c_minMatch."); - ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offCode, matchLength); + ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offBase, matchLength); ip += matchLength + litLength; } DEBUGLOG(5, "Ending seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength); diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index f71791ec0..9fe3affab 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -577,28 +577,27 @@ ZSTD_safecopyLiterals(BYTE* op, BYTE const* ip, BYTE const* const iend, BYTE con while (ip < iend) *op++ = *ip++; } -#define STORE_REPCODE_1 STORE_REPCODE(1) -#define STORE_REPCODE_2 STORE_REPCODE(2) -#define STORE_REPCODE_3 STORE_REPCODE(3) -#define STORE_REPCODE(r) (assert((r)>=1), assert((r)<=ZSTD_REP_NUM), (r)) /* accepts IDs 1,2,3 */ -#define STORE_OFFSET(o) (assert((o)>0), o + ZSTD_REP_NUM) -#define STORED_IS_OFFSET(o) ((o) > ZSTD_REP_NUM) -#define STORED_IS_REPCODE(o) ( 1 <= (o) && (o) <= ZSTD_REP_NUM) -#define STORED_OFFSET(o) (assert(STORED_IS_OFFSET(o)), (o) - ZSTD_REP_NUM) -#define STORED_REPCODE(o) (assert(STORED_IS_REPCODE(o)), (o)) /* returns ID 1,2,3 */ -#define STORED_TO_OFFBASE(o) (o) -#define OFFBASE_TO_STORED(o) (o) + +#define REPCODE1_TO_OFFBASE REPCODE_TO_OFFBASE(1) +#define REPCODE2_TO_OFFBASE REPCODE_TO_OFFBASE(2) +#define REPCODE3_TO_OFFBASE REPCODE_TO_OFFBASE(3) +#define REPCODE_TO_OFFBASE(r) (assert((r)>=1), assert((r)<=ZSTD_REP_NUM), (r)) /* accepts IDs 1,2,3 */ +#define OFFSET_TO_OFFBASE(o) (assert((o)>0), o + ZSTD_REP_NUM) +#define OFFBASE_IS_OFFSET(o) ((o) > ZSTD_REP_NUM) +#define OFFBASE_IS_REPCODE(o) ( 1 <= (o) && (o) <= ZSTD_REP_NUM) +#define OFFBASE_TO_OFFSET(o) (assert(OFFBASE_IS_OFFSET(o)), (o) - ZSTD_REP_NUM) +#define OFFBASE_TO_REPCODE(o) (assert(OFFBASE_IS_REPCODE(o)), (o)) /* returns ID 1,2,3 */ /*! ZSTD_storeSeq() : - * Store a sequence (litlen, litPtr, offCode and matchLength) into seqStore_t. - * @offBase_minus1 : Users should use employ macros STORE_REPCODE_X and STORE_OFFSET(). + * Store a sequence (litlen, litPtr, offBase and matchLength) into seqStore_t. + * @offBase : Users should employ macros REPCODE_TO_OFFBASE() and OFFSET_TO_OFFBASE(). * @matchLength : must be >= MINMATCH - * Allowed to overread literals up to litLimit. + * Allowed to over-read literals up to litLimit. */ HINT_INLINE UNUSED_ATTR void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const BYTE* literals, const BYTE* litLimit, - U32 offBase_minus1, + U32 offBase, size_t matchLength) { BYTE const* const litLimit_w = litLimit - WILDCOPY_OVERLENGTH; @@ -607,8 +606,8 @@ ZSTD_storeSeq(seqStore_t* seqStorePtr, static const BYTE* g_start = NULL; if (g_start==NULL) g_start = (const BYTE*)literals; /* note : index only works for compression within a single segment */ { U32 const pos = (U32)((const BYTE*)literals - g_start); - DEBUGLOG(6, "Cpos%7u :%3u literals, match%4u bytes at offCode%7u", - pos, (U32)litLength, (U32)matchLength, (U32)offBase_minus1); + DEBUGLOG(6, "Cpos%7u :%3u literals, match%4u bytes at offBase%7u", + pos, (U32)litLength, (U32)matchLength, (U32)offBase); } #endif assert((size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart) < seqStorePtr->maxNbSeq); @@ -618,9 +617,9 @@ ZSTD_storeSeq(seqStore_t* seqStorePtr, assert(literals + litLength <= litLimit); if (litEnd <= litLimit_w) { /* Common case we can use wildcopy. - * First copy 16 bytes, because literals are likely short. - */ - assert(WILDCOPY_OVERLENGTH >= 16); + * First copy 16 bytes, because literals are likely short. + */ + ZSTD_STATIC_ASSERT(WILDCOPY_OVERLENGTH >= 16); ZSTD_copy16(seqStorePtr->lit, literals); if (litLength > 16) { ZSTD_wildcopy(seqStorePtr->lit+16, literals+16, (ptrdiff_t)litLength-16, ZSTD_no_overlap); @@ -639,7 +638,7 @@ ZSTD_storeSeq(seqStore_t* seqStorePtr, seqStorePtr->sequences[0].litLength = (U16)litLength; /* match offset */ - seqStorePtr->sequences[0].offBase = STORED_TO_OFFBASE(offBase_minus1); + seqStorePtr->sequences[0].offBase = offBase; /* match Length */ assert(matchLength >= MINMATCH); @@ -657,17 +656,17 @@ ZSTD_storeSeq(seqStore_t* seqStorePtr, /* ZSTD_updateRep() : * updates in-place @rep (array of repeat offsets) - * @offBase_minus1 : sum-type, with same numeric representation as ZSTD_storeSeq() + * @offBase : sum-type, using numeric representation of ZSTD_storeSeq() */ MEM_STATIC void -ZSTD_updateRep(U32 rep[ZSTD_REP_NUM], U32 const offBase_minus1, U32 const ll0) +ZSTD_updateRep(U32 rep[ZSTD_REP_NUM], U32 const offBase, U32 const ll0) { - if (STORED_IS_OFFSET(offBase_minus1)) { /* full offset */ + if (OFFBASE_IS_OFFSET(offBase)) { /* full offset */ rep[2] = rep[1]; rep[1] = rep[0]; - rep[0] = STORED_OFFSET(offBase_minus1); + rep[0] = OFFBASE_TO_OFFSET(offBase); } else { /* repcode */ - U32 const repCode = STORED_REPCODE(offBase_minus1) - 1 + ll0; + U32 const repCode = OFFBASE_TO_REPCODE(offBase) - 1 + ll0; if (repCode > 0) { /* note : if repCode==0, no change */ U32 const currentOffset = (repCode==ZSTD_REP_NUM) ? (rep[0] - 1) : rep[repCode]; rep[2] = (repCode >= 2) ? rep[1] : rep[2]; @@ -684,11 +683,11 @@ typedef struct repcodes_s { } repcodes_t; MEM_STATIC repcodes_t -ZSTD_newRep(U32 const rep[ZSTD_REP_NUM], U32 const offBase_minus1, U32 const ll0) +ZSTD_newRep(U32 const rep[ZSTD_REP_NUM], U32 const offBase, U32 const ll0) { repcodes_t newReps; ZSTD_memcpy(&newReps, rep, sizeof(newReps)); - ZSTD_updateRep(newReps.rep, offBase_minus1, ll0); + ZSTD_updateRep(newReps.rep, offBase, ll0); return newReps; } diff --git a/lib/compress/zstd_compress_superblock.c b/lib/compress/zstd_compress_superblock.c index 10e337857..5e89a706c 100644 --- a/lib/compress/zstd_compress_superblock.c +++ b/lib/compress/zstd_compress_superblock.c @@ -38,11 +38,12 @@ * @return : compressed size of literals section of a sub-block * Or 0 if it unable to compress. * Or error code */ -static size_t ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, - const ZSTD_hufCTablesMetadata_t* hufMetadata, - const BYTE* literals, size_t litSize, - void* dst, size_t dstSize, - const int bmi2, int writeEntropy, int* entropyWritten) +static size_t +ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, + const ZSTD_hufCTablesMetadata_t* hufMetadata, + const BYTE* literals, size_t litSize, + void* dst, size_t dstSize, + const int bmi2, int writeEntropy, int* entropyWritten) { size_t const header = writeEntropy ? 200 : 0; size_t const lhSize = 3 + (litSize >= (1 KB - header)) + (litSize >= (16 KB - header)); @@ -126,7 +127,11 @@ static size_t ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, return op-ostart; } -static size_t ZSTD_seqDecompressedSize(seqStore_t const* seqStore, const seqDef* sequences, size_t nbSeq, size_t litSize, int lastSequence) { +static size_t +ZSTD_seqDecompressedSize(seqStore_t const* seqStore, + const seqDef* sequences, size_t nbSeq, + size_t litSize, int lastSequence) +{ const seqDef* const sstart = sequences; const seqDef* const send = sequences + nbSeq; const seqDef* sp = sstart; @@ -156,13 +161,14 @@ static size_t ZSTD_seqDecompressedSize(seqStore_t const* seqStore, const seqDef* * @return : compressed size of sequences section of a sub-block * Or 0 if it is unable to compress * Or error code. */ -static size_t ZSTD_compressSubBlock_sequences(const ZSTD_fseCTables_t* fseTables, - const ZSTD_fseCTablesMetadata_t* fseMetadata, - const seqDef* sequences, size_t nbSeq, - const BYTE* llCode, const BYTE* mlCode, const BYTE* ofCode, - const ZSTD_CCtx_params* cctxParams, - void* dst, size_t dstCapacity, - const int bmi2, int writeEntropy, int* entropyWritten) +static size_t +ZSTD_compressSubBlock_sequences(const ZSTD_fseCTables_t* fseTables, + const ZSTD_fseCTablesMetadata_t* fseMetadata, + const seqDef* sequences, size_t nbSeq, + const BYTE* llCode, const BYTE* mlCode, const BYTE* ofCode, + const ZSTD_CCtx_params* cctxParams, + void* dst, size_t dstCapacity, + const int bmi2, int writeEntropy, int* entropyWritten) { const int longOffsets = cctxParams->cParams.windowLog > STREAM_ACCUMULATOR_MIN; BYTE* const ostart = (BYTE*)dst; @@ -539,7 +545,7 @@ static size_t ZSTD_compressSubBlock_multi(const seqStore_t* seqStorePtr, repcodes_t rep; ZSTD_memcpy(&rep, prevCBlock->rep, sizeof(rep)); for (seq = sstart; seq < sp; ++seq) { - ZSTD_updateRep(rep.rep, seq->offBase - 1, ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0); + ZSTD_updateRep(rep.rep, seq->offBase, ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0); } ZSTD_memcpy(nextCBlock->rep, &rep, sizeof(rep)); } diff --git a/lib/compress/zstd_double_fast.c b/lib/compress/zstd_double_fast.c index 76933dea2..610a1b3ec 100644 --- a/lib/compress/zstd_double_fast.c +++ b/lib/compress/zstd_double_fast.c @@ -131,7 +131,7 @@ size_t ZSTD_compressBlock_doubleFast_noDict_generic( if ((offset_1 > 0) & (MEM_read32(ip+1-offset_1) == MEM_read32(ip+1))) { mLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); goto _match_stored; } @@ -217,7 +217,7 @@ _match_found: /* requires ip, offset, mLength */ hashLong[hl1] = (U32)(ip1 - base); } - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); _match_stored: /* match found */ @@ -243,7 +243,7 @@ _match_stored: U32 const tmpOff = offset_2; offset_2 = offset_1; offset_1 = tmpOff; /* swap offset_2 <=> offset_1 */ hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = (U32)(ip-base); hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = (U32)(ip-base); - ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, rLength); + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, rLength); ip += rLength; anchor = ip; continue; /* faster when present ... (?) */ @@ -328,7 +328,7 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); goto _match_stored; } @@ -419,7 +419,7 @@ _match_found: offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); _match_stored: /* match found */ @@ -448,7 +448,7 @@ _match_stored: const BYTE* const repEnd2 = repIndex2 < prefixLowestIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixLowest) + 4; U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, repLength2); + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; ip += repLength2; @@ -585,7 +585,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( const BYTE* repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); } else { if ((matchLongIndex > dictStartIndex) && (MEM_read64(matchLong) == MEM_read64(ip))) { const BYTE* const matchEnd = matchLongIndex < prefixStartIndex ? dictEnd : iend; @@ -596,7 +596,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( while (((ip>anchor) & (matchLong>lowMatchPtr)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); } else if ((matchIndex > dictStartIndex) && (MEM_read32(match) == MEM_read32(ip))) { size_t const h3 = ZSTD_hashPtr(ip+1, hBitsL, 8); @@ -621,7 +621,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( } offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); } else { ip += ((ip-anchor) >> kSearchStrength) + 1; @@ -653,7 +653,7 @@ static size_t ZSTD_compressBlock_doubleFast_extDict_generic( const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, repLength2); + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); hashSmall[ZSTD_hashPtr(ip, hBitsS, mls)] = current2; hashLong[ZSTD_hashPtr(ip, hBitsL, 8)] = current2; ip += repLength2; diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 802fc3157..62c4c2cea 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -180,7 +180,7 @@ _start: /* Requires: ip0 */ mLength = ip0[-1] == match0[-1]; ip0 -= mLength; match0 -= mLength; - offcode = STORE_REPCODE_1; + offcode = REPCODE1_TO_OFFBASE; mLength += 4; goto _match; } @@ -267,7 +267,7 @@ _offset: /* Requires: ip0, idx */ match0 = base + idx; rep_offset2 = rep_offset1; rep_offset1 = (U32)(ip0-match0); - offcode = STORE_OFFSET(rep_offset1); + offcode = OFFSET_TO_OFFBASE(rep_offset1); mLength = 4; /* Count the backwards match length. */ @@ -306,7 +306,7 @@ _match: /* Requires: ip0, match0, offcode */ { U32 const tmpOff = rep_offset2; rep_offset2 = rep_offset1; rep_offset1 = tmpOff; } /* swap rep_offset2 <=> rep_offset1 */ hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = (U32)(ip0-base); ip0 += rLength; - ZSTD_storeSeq(seqStore, 0 /*litLen*/, anchor, iend, STORE_REPCODE_1, rLength); + ZSTD_storeSeq(seqStore, 0 /*litLen*/, anchor, iend, REPCODE1_TO_OFFBASE, rLength); anchor = ip0; continue; /* faster when present (confirmed on gcc-8) ... (?) */ } } } @@ -439,7 +439,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); } else if ( (matchIndex <= prefixStartIndex) ) { size_t const dictHash = ZSTD_hashPtr(ip, dictHLog, mls); U32 const dictMatchIndex = dictHashTable[dictHash]; @@ -459,7 +459,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); } } else if (MEM_read32(match) != MEM_read32(ip)) { /* it's not a match, and we're not going to check the dictionary */ @@ -474,7 +474,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); } /* match found */ @@ -499,7 +499,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, repLength2); + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2; ip += repLength2; anchor = ip; @@ -598,7 +598,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; size_t const rLength = ZSTD_count_2segments(ip+1 +4, repMatch +4, iend, repMatchEnd, prefixStart) + 4; ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_REPCODE_1, rLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, rLength); ip += rLength; anchor = ip; } else { @@ -614,7 +614,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( size_t mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, prefixStart) + 4; while (((ip>anchor) & (match>lowMatchPtr)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; /* update offset history */ - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, STORE_OFFSET(offset), mLength); + ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); ip += mLength; anchor = ip; } } @@ -633,7 +633,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; { U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; } /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0 /*litlen*/, anchor, iend, STORE_REPCODE_1, repLength2); + ZSTD_storeSeq(seqStore, 0 /*litlen*/, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2; ip += repLength2; anchor = ip; diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 2e38dcb46..2a0cfc893 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -197,8 +197,8 @@ ZSTD_DUBT_findBetterDictMatch ( U32 matchIndex = dictMatchIndex + dictIndexDelta; if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) { DEBUGLOG(9, "ZSTD_DUBT_findBetterDictMatch(%u) : found better match length %u -> %u and offsetCode %u -> %u (dictMatchIndex %u, matchIndex %u)", - curr, (U32)bestLength, (U32)matchLength, (U32)*offsetPtr, STORE_OFFSET(curr - matchIndex), dictMatchIndex, matchIndex); - bestLength = matchLength, *offsetPtr = STORE_OFFSET(curr - matchIndex); + curr, (U32)bestLength, (U32)matchLength, (U32)*offsetPtr, OFFSET_TO_OFFBASE(curr - matchIndex), dictMatchIndex, matchIndex); + bestLength = matchLength, *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); } if (ip+matchLength == iend) { /* reached end of input : ip[matchLength] is not valid, no way to know if it's larger or smaller than match */ break; /* drop, to guarantee consistency (miss a little bit of compression) */ @@ -218,7 +218,7 @@ ZSTD_DUBT_findBetterDictMatch ( } if (bestLength >= MINMATCH) { - U32 const mIndex = curr - (U32)STORED_OFFSET(*offsetPtr); (void)mIndex; + U32 const mIndex = curr - (U32)OFFBASE_TO_OFFSET(*offsetPtr); (void)mIndex; DEBUGLOG(8, "ZSTD_DUBT_findBetterDictMatch(%u) : found match of length %u and offsetCode %u (pos %u)", curr, (U32)bestLength, (U32)*offsetPtr, mIndex); } @@ -328,7 +328,7 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) - bestLength = matchLength, *offsetPtr = STORE_OFFSET(curr - matchIndex); + bestLength = matchLength, *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); if (ip+matchLength == iend) { /* equal : no way to know if inf or sup */ if (dictMode == ZSTD_dictMatchState) { nbCompares = 0; /* in addition to avoiding checking any @@ -368,7 +368,7 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, assert(matchEndIdx > curr+8); /* ensure nextToUpdate is increased */ ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */ if (bestLength >= MINMATCH) { - U32 const mIndex = curr - (U32)STORED_OFFSET(*offsetPtr); (void)mIndex; + U32 const mIndex = curr - (U32)OFFBASE_TO_OFFSET(*offsetPtr); (void)mIndex; DEBUGLOG(8, "ZSTD_DUBT_findBestMatch(%u) : found match of length %u and offsetCode %u (pos %u)", curr, (U32)bestLength, (U32)*offsetPtr, mIndex); } @@ -561,7 +561,7 @@ size_t ZSTD_dedicatedDictSearch_lazy_search(size_t* offsetPtr, size_t ml, U32 nb /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = STORE_OFFSET(curr - (matchIndex + ddsIndexDelta)); + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + ddsIndexDelta)); if (ip+currentMl == iLimit) { /* best possible, avoids read overflow on next attempt */ return ml; @@ -598,7 +598,7 @@ size_t ZSTD_dedicatedDictSearch_lazy_search(size_t* offsetPtr, size_t ml, U32 nb /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = STORE_OFFSET(curr - (matchIndex + ddsIndexDelta)); + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + ddsIndexDelta)); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } } @@ -703,7 +703,7 @@ size_t ZSTD_HcFindBestMatch( /* save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = STORE_OFFSET(curr - matchIndex); + *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } @@ -739,7 +739,7 @@ size_t ZSTD_HcFindBestMatch( if (currentMl > ml) { ml = currentMl; assert(curr > matchIndex + dmsIndexDelta); - *offsetPtr = STORE_OFFSET(curr - (matchIndex + dmsIndexDelta)); + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + dmsIndexDelta)); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } @@ -1245,7 +1245,7 @@ size_t ZSTD_RowFindBestMatch( /* Save best solution */ if (currentMl > ml) { ml = currentMl; - *offsetPtr = STORE_OFFSET(curr - matchIndex); + *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } } @@ -1294,7 +1294,7 @@ size_t ZSTD_RowFindBestMatch( if (currentMl > ml) { ml = currentMl; assert(curr > matchIndex + dmsIndexDelta); - *offsetPtr = STORE_OFFSET(curr - (matchIndex + dmsIndexDelta)); + *offsetPtr = OFFSET_TO_OFFBASE(curr - (matchIndex + dmsIndexDelta)); if (ip+currentMl == iLimit) break; } } @@ -1539,7 +1539,7 @@ ZSTD_compressBlock_lazy_generic( #endif while (ip < ilimit) { size_t matchLength=0; - size_t offcode=STORE_REPCODE_1; + size_t offBase = REPCODE1_TO_OFFBASE; const BYTE* start=ip+1; DEBUGLOG(7, "search baseline (depth 0)"); @@ -1564,10 +1564,10 @@ ZSTD_compressBlock_lazy_generic( } /* first search (depth 0) */ - { size_t offsetFound = 999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offsetFound); + { size_t offbaseFound = 999999999; + size_t const ml2 = searchMax(ms, ip, iend, &offbaseFound); if (ml2 > matchLength) - matchLength = ml2, start = ip, offcode=offsetFound; + matchLength = ml2, start = ip, offBase = offbaseFound; } if (matchLength < 4) { @@ -1581,12 +1581,12 @@ ZSTD_compressBlock_lazy_generic( DEBUGLOG(7, "search depth 1"); ip ++; if ( (dictMode == ZSTD_noDict) - && (offcode) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { + && (offBase) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; int const gain2 = (int)(mlRep * 3); - int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offBase) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offcode = STORE_REPCODE_1, start = ip; + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; } if (isDxS) { const U32 repIndex = (U32)(ip - base) - offset_1; @@ -1598,17 +1598,17 @@ ZSTD_compressBlock_lazy_generic( const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; int const gain2 = (int)(mlRep * 3); - int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offBase) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offcode = STORE_REPCODE_1, start = ip; + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; } } - { size_t offset2=999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offset2))); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 4); + { size_t ofbCandidate=999999999; + size_t const ml2 = searchMax(ms, ip, iend, &ofbCandidate); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 4); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offcode = offset2, start = ip; + matchLength = ml2, offBase = ofbCandidate, start = ip; continue; /* search a better one */ } } @@ -1617,12 +1617,12 @@ ZSTD_compressBlock_lazy_generic( DEBUGLOG(7, "search depth 2"); ip ++; if ( (dictMode == ZSTD_noDict) - && (offcode) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { + && (offBase) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; int const gain2 = (int)(mlRep * 4); - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offcode = STORE_REPCODE_1, start = ip; + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; } if (isDxS) { const U32 repIndex = (U32)(ip - base) - offset_1; @@ -1634,17 +1634,17 @@ ZSTD_compressBlock_lazy_generic( const BYTE* repMatchEnd = repIndex < prefixLowestIndex ? dictEnd : iend; size_t const mlRep = ZSTD_count_2segments(ip+4, repMatch+4, iend, repMatchEnd, prefixLowest) + 4; int const gain2 = (int)(mlRep * 4); - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 1); if ((mlRep >= 4) && (gain2 > gain1)) - matchLength = mlRep, offcode = STORE_REPCODE_1, start = ip; + matchLength = mlRep, offBase = REPCODE1_TO_OFFBASE, start = ip; } } - { size_t offset2=999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offset2))); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 7); + { size_t ofbCandidate=999999999; + size_t const ml2 = searchMax(ms, ip, iend, &ofbCandidate); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 7); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offcode = offset2, start = ip; + matchLength = ml2, offBase = ofbCandidate, start = ip; continue; } } } break; /* nothing found : store previous solution */ @@ -1655,24 +1655,24 @@ ZSTD_compressBlock_lazy_generic( * notably if `value` is unsigned, resulting in a large positive `-value`. */ /* catch up */ - if (STORED_IS_OFFSET(offcode)) { + if (OFFBASE_IS_OFFSET(offBase)) { if (dictMode == ZSTD_noDict) { - while ( ((start > anchor) & (start - STORED_OFFSET(offcode) > prefixLowest)) - && (start[-1] == (start-STORED_OFFSET(offcode))[-1]) ) /* only search for offset within prefix */ + while ( ((start > anchor) & (start - OFFBASE_TO_OFFSET(offBase) > prefixLowest)) + && (start[-1] == (start-OFFBASE_TO_OFFSET(offBase))[-1]) ) /* only search for offset within prefix */ { start--; matchLength++; } } if (isDxS) { - U32 const matchIndex = (U32)((size_t)(start-base) - STORED_OFFSET(offcode)); + U32 const matchIndex = (U32)((size_t)(start-base) - OFFBASE_TO_OFFSET(offBase)); const BYTE* match = (matchIndex < prefixLowestIndex) ? dictBase + matchIndex - dictIndexDelta : base + matchIndex; const BYTE* const mStart = (matchIndex < prefixLowestIndex) ? dictLowest : prefixLowest; while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; } /* catch up */ } - offset_2 = offset_1; offset_1 = (U32)STORED_OFFSET(offcode); + offset_2 = offset_1; offset_1 = (U32)OFFBASE_TO_OFFSET(offBase); } /* store sequence */ _storeSequence: { size_t const litLength = (size_t)(start - anchor); - ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offcode, matchLength); + ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offBase, matchLength); anchor = ip = start + matchLength; } @@ -1688,8 +1688,8 @@ _storeSequence: && (MEM_read32(repMatch) == MEM_read32(ip)) ) { const BYTE* const repEnd2 = repIndex < prefixLowestIndex ? dictEnd : iend; matchLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd2, prefixLowest) + 4; - offcode = offset_2; offset_2 = offset_1; offset_1 = (U32)offcode; /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, matchLength); + offBase = offset_2; offset_2 = offset_1; offset_1 = (U32)offBase; /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, matchLength); ip += matchLength; anchor = ip; continue; @@ -1703,8 +1703,8 @@ _storeSequence: && (MEM_read32(ip) == MEM_read32(ip - offset_2)) ) { /* store sequence */ matchLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; - offcode = offset_2; offset_2 = offset_1; offset_1 = (U32)offcode; /* swap repcodes */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, matchLength); + offBase = offset_2; offset_2 = offset_1; offset_1 = (U32)offBase; /* swap repcodes */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, matchLength); ip += matchLength; anchor = ip; continue; /* faster when present ... (?) */ @@ -1905,7 +1905,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( #endif while (ip < ilimit) { size_t matchLength=0; - size_t offcode=STORE_REPCODE_1; + size_t offBase = REPCODE1_TO_OFFBASE; const BYTE* start=ip+1; U32 curr = (U32)(ip-base); @@ -1924,10 +1924,10 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( } } /* first search (depth 0) */ - { size_t offsetFound = 999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offsetFound); + { size_t ofbCandidate = 999999999; + size_t const ml2 = searchMax(ms, ip, iend, &ofbCandidate); if (ml2 > matchLength) - matchLength = ml2, start = ip, offcode=offsetFound; + matchLength = ml2, start = ip, offBase = ofbCandidate; } if (matchLength < 4) { @@ -1941,7 +1941,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( ip ++; curr++; /* check repCode */ - if (offcode) { + if (offBase) { const U32 windowLow = ZSTD_getLowestMatchIndex(ms, curr, windowLog); const U32 repIndex = (U32)(curr - offset_1); const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; @@ -1953,18 +1953,18 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; size_t const repLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; int const gain2 = (int)(repLength * 3); - int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); + int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offBase) + 1); if ((repLength >= 4) && (gain2 > gain1)) - matchLength = repLength, offcode = STORE_REPCODE_1, start = ip; + matchLength = repLength, offBase = REPCODE1_TO_OFFBASE, start = ip; } } /* search match, depth 1 */ - { size_t offset2=999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offset2))); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 4); + { size_t ofbCandidate=999999999; + size_t const ml2 = searchMax(ms, ip, iend, &ofbCandidate); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 4); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offcode = offset2, start = ip; + matchLength = ml2, offBase = ofbCandidate, start = ip; continue; /* search a better one */ } } @@ -1973,7 +1973,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( ip ++; curr++; /* check repCode */ - if (offcode) { + if (offBase) { const U32 windowLow = ZSTD_getLowestMatchIndex(ms, curr, windowLog); const U32 repIndex = (U32)(curr - offset_1); const BYTE* const repBase = repIndex < dictLimit ? dictBase : base; @@ -1985,36 +1985,36 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; size_t const repLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; int const gain2 = (int)(repLength * 4); - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 1); + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 1); if ((repLength >= 4) && (gain2 > gain1)) - matchLength = repLength, offcode = STORE_REPCODE_1, start = ip; + matchLength = repLength, offBase = REPCODE1_TO_OFFBASE, start = ip; } } /* search match, depth 2 */ - { size_t offset2=999999999; - size_t const ml2 = searchMax(ms, ip, iend, &offset2); - int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offset2))); /* raw approx */ - int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)STORED_TO_OFFBASE(offcode)) + 7); + { size_t ofbCandidate=999999999; + size_t const ml2 = searchMax(ms, ip, iend, &ofbCandidate); + int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ + int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 7); if ((ml2 >= 4) && (gain2 > gain1)) { - matchLength = ml2, offcode = offset2, start = ip; + matchLength = ml2, offBase = ofbCandidate, start = ip; continue; } } } break; /* nothing found : store previous solution */ } /* catch up */ - if (STORED_IS_OFFSET(offcode)) { - U32 const matchIndex = (U32)((size_t)(start-base) - STORED_OFFSET(offcode)); + if (OFFBASE_IS_OFFSET(offBase)) { + U32 const matchIndex = (U32)((size_t)(start-base) - OFFBASE_TO_OFFSET(offBase)); const BYTE* match = (matchIndex < dictLimit) ? dictBase + matchIndex : base + matchIndex; const BYTE* const mStart = (matchIndex < dictLimit) ? dictStart : prefixStart; while ((start>anchor) && (match>mStart) && (start[-1] == match[-1])) { start--; match--; matchLength++; } /* catch up */ - offset_2 = offset_1; offset_1 = (U32)STORED_OFFSET(offcode); + offset_2 = offset_1; offset_1 = (U32)OFFBASE_TO_OFFSET(offBase); } /* store sequence */ _storeSequence: { size_t const litLength = (size_t)(start - anchor); - ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offcode, matchLength); + ZSTD_storeSeq(seqStore, litLength, anchor, iend, (U32)offBase, matchLength); anchor = ip = start + matchLength; } @@ -2031,8 +2031,8 @@ _storeSequence: /* repcode detected we should take it */ const BYTE* const repEnd = repIndex < dictLimit ? dictEnd : iend; matchLength = ZSTD_count_2segments(ip+4, repMatch+4, iend, repEnd, prefixStart) + 4; - offcode = offset_2; offset_2 = offset_1; offset_1 = (U32)offcode; /* swap offset history */ - ZSTD_storeSeq(seqStore, 0, anchor, iend, STORE_REPCODE_1, matchLength); + offBase = offset_2; offset_2 = offset_1; offset_1 = (U32)offBase; /* swap offset history */ + ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, matchLength); ip += matchLength; anchor = ip; continue; /* faster when present ... (?) */ diff --git a/lib/compress/zstd_ldm.c b/lib/compress/zstd_ldm.c index f662b2546..1c04a36f9 100644 --- a/lib/compress/zstd_ldm.c +++ b/lib/compress/zstd_ldm.c @@ -711,7 +711,7 @@ size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore, rep[0] = sequence.offset; /* Store the sequence */ ZSTD_storeSeq(seqStore, newLitLength, ip - newLitLength, iend, - STORE_OFFSET(sequence.offset), + OFFSET_TO_OFFBASE(sequence.offset), sequence.matchLength); ip += sequence.matchLength; } diff --git a/lib/compress/zstd_opt.c b/lib/compress/zstd_opt.c index 2fa10816f..5cd34acd0 100644 --- a/lib/compress/zstd_opt.c +++ b/lib/compress/zstd_opt.c @@ -282,17 +282,17 @@ static U32 ZSTD_litLengthPrice(U32 const litLength, const optState_t* const optP /* ZSTD_getMatchPrice() : * Provides the cost of the match part (offset + matchLength) of a sequence * Must be combined with ZSTD_fullLiteralsCost() to get the full cost of a sequence. - * @offcode : expects a scale where 0,1,2 are repcodes 1-3, and 3+ are real_offsets+2 + * @offBase : sumtype, representing an offset or a repcode, and using numeric representation of ZSTD_storeSeq() * @optLevel: when <2, favors small offset for decompression speed (improved cache efficiency) */ FORCE_INLINE_TEMPLATE U32 -ZSTD_getMatchPrice(U32 const offcode, +ZSTD_getMatchPrice(U32 const offBase, U32 const matchLength, const optState_t* const optPtr, int const optLevel) { U32 price; - U32 const offCode = ZSTD_highbit32(STORED_TO_OFFBASE(offcode)); + U32 const offCode = ZSTD_highbit32(offBase); U32 const mlBase = matchLength - MINMATCH; assert(matchLength >= MINMATCH); @@ -316,10 +316,10 @@ ZSTD_getMatchPrice(U32 const offcode, } /* ZSTD_updateStats() : - * assumption : literals + litLengtn <= iend */ + * assumption : literals + litLength <= iend */ static void ZSTD_updateStats(optState_t* const optPtr, U32 litLength, const BYTE* literals, - U32 offsetCode, U32 matchLength) + U32 offBase, U32 matchLength) { /* literals */ if (ZSTD_compressedLiterals(optPtr)) { @@ -336,7 +336,7 @@ static void ZSTD_updateStats(optState_t* const optPtr, } /* offset code : expected to follow storeSeq() numeric representation */ - { U32 const offCode = ZSTD_highbit32(STORED_TO_OFFBASE(offsetCode)); + { U32 const offCode = ZSTD_highbit32(offBase); assert(offCode <= MaxOff); optPtr->offCodeFreq[offCode]++; optPtr->offCodeSum++; @@ -635,7 +635,7 @@ U32 ZSTD_insertBtAndGetAllMatches ( DEBUGLOG(8, "found repCode %u (ll0:%u, offset:%u) of length %u", repCode, ll0, repOffset, repLen); bestLength = repLen; - matches[mnum].off = STORE_REPCODE(repCode - ll0 + 1); /* expect value between 1 and 3 */ + matches[mnum].off = REPCODE_TO_OFFBASE(repCode - ll0 + 1); /* expect value between 1 and 3 */ matches[mnum].len = (U32)repLen; mnum++; if ( (repLen > sufficient_len) @@ -664,7 +664,7 @@ U32 ZSTD_insertBtAndGetAllMatches ( bestLength = mlen; assert(curr > matchIndex3); assert(mnum==0); /* no prior solution */ - matches[0].off = STORE_OFFSET(curr - matchIndex3); + matches[0].off = OFFSET_TO_OFFBASE(curr - matchIndex3); matches[0].len = (U32)mlen; mnum = 1; if ( (mlen > sufficient_len) | @@ -697,13 +697,13 @@ U32 ZSTD_insertBtAndGetAllMatches ( } if (matchLength > bestLength) { - DEBUGLOG(8, "found match of length %u at distance %u (offCode=%u)", - (U32)matchLength, curr - matchIndex, STORE_OFFSET(curr - matchIndex)); + DEBUGLOG(8, "found match of length %u at distance %u (offBase=%u)", + (U32)matchLength, curr - matchIndex, OFFSET_TO_OFFBASE(curr - matchIndex)); assert(matchEndIdx > matchIndex); if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; bestLength = matchLength; - matches[mnum].off = STORE_OFFSET(curr - matchIndex); + matches[mnum].off = OFFSET_TO_OFFBASE(curr - matchIndex); matches[mnum].len = (U32)matchLength; mnum++; if ( (matchLength > ZSTD_OPT_NUM) @@ -745,12 +745,12 @@ U32 ZSTD_insertBtAndGetAllMatches ( if (matchLength > bestLength) { matchIndex = dictMatchIndex + dmsIndexDelta; - DEBUGLOG(8, "found dms match of length %u at distance %u (offCode=%u)", - (U32)matchLength, curr - matchIndex, STORE_OFFSET(curr - matchIndex)); + DEBUGLOG(8, "found dms match of length %u at distance %u (offBase=%u)", + (U32)matchLength, curr - matchIndex, OFFSET_TO_OFFBASE(curr - matchIndex)); if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; bestLength = matchLength; - matches[mnum].off = STORE_OFFSET(curr - matchIndex); + matches[mnum].off = OFFSET_TO_OFFBASE(curr - matchIndex); matches[mnum].len = (U32)matchLength; mnum++; if ( (matchLength > ZSTD_OPT_NUM) @@ -951,7 +951,7 @@ static void ZSTD_optLdm_maybeAddMatch(ZSTD_match_t* matches, U32* nbMatches, const ZSTD_optLdm_t* optLdm, U32 currPosInBlock) { U32 const posDiff = currPosInBlock - optLdm->startPosInBlock; - /* Note: ZSTD_match_t actually contains offCode and matchLength (before subtracting MINMATCH) */ + /* Note: ZSTD_match_t actually contains offBase and matchLength (before subtracting MINMATCH) */ U32 const candidateMatchLength = optLdm->endPosInBlock - optLdm->startPosInBlock - posDiff; /* Ensure that current block position is not outside of the match */ @@ -962,11 +962,11 @@ static void ZSTD_optLdm_maybeAddMatch(ZSTD_match_t* matches, U32* nbMatches, } if (*nbMatches == 0 || ((candidateMatchLength > matches[*nbMatches-1].len) && *nbMatches < ZSTD_OPT_NUM)) { - U32 const candidateOffCode = STORE_OFFSET(optLdm->offset); - DEBUGLOG(6, "ZSTD_optLdm_maybeAddMatch(): Adding ldm candidate match (offCode: %u matchLength %u) at block position=%u", - candidateOffCode, candidateMatchLength, currPosInBlock); + U32 const candidateOffBase = OFFSET_TO_OFFBASE(optLdm->offset); + DEBUGLOG(6, "ZSTD_optLdm_maybeAddMatch(): Adding ldm candidate match (offBase: %u matchLength %u) at block position=%u", + candidateOffBase, candidateMatchLength, currPosInBlock); matches[*nbMatches].len = candidateMatchLength; - matches[*nbMatches].off = candidateOffCode; + matches[*nbMatches].off = candidateOffBase; (*nbMatches)++; } } @@ -1089,14 +1089,14 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, /* large match -> immediate encoding */ { U32 const maxML = matches[nbMatches-1].len; - U32 const maxOffcode = matches[nbMatches-1].off; - DEBUGLOG(6, "found %u matches of maxLength=%u and maxOffCode=%u at cPos=%u => start new series", - nbMatches, maxML, maxOffcode, (U32)(ip-prefixStart)); + U32 const maxOffBase = matches[nbMatches-1].off; + DEBUGLOG(6, "found %u matches of maxLength=%u and maxOffBase=%u at cPos=%u => start new series", + nbMatches, maxML, maxOffBase, (U32)(ip-prefixStart)); if (maxML > sufficient_len) { lastSequence.litlen = litlen; lastSequence.mlen = maxML; - lastSequence.off = maxOffcode; + lastSequence.off = maxOffBase; DEBUGLOG(6, "large match (%u>%u), immediate encoding", maxML, sufficient_len); cur = 0; @@ -1113,15 +1113,15 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, opt[pos].price = ZSTD_MAX_PRICE; /* mlen, litlen and price will be fixed during forward scanning */ } for (matchNb = 0; matchNb < nbMatches; matchNb++) { - U32 const offcode = matches[matchNb].off; + U32 const offBase = matches[matchNb].off; U32 const end = matches[matchNb].len; for ( ; pos <= end ; pos++ ) { - U32 const matchPrice = ZSTD_getMatchPrice(offcode, pos, optStatePtr, optLevel); + U32 const matchPrice = ZSTD_getMatchPrice(offBase, pos, optStatePtr, optLevel); U32 const sequencePrice = literalsPrice + matchPrice; DEBUGLOG(7, "rPos:%u => set initial price : %.2f", pos, ZSTD_fCost(sequencePrice)); opt[pos].mlen = pos; - opt[pos].off = offcode; + opt[pos].off = offBase; opt[pos].litlen = litlen; opt[pos].price = (int)sequencePrice; } } @@ -1221,7 +1221,7 @@ ZSTD_compressBlock_opt_generic(ZSTD_matchState_t* ms, U32 const startML = (matchNb>0) ? matches[matchNb-1].len+1 : minMatch; U32 mlen; - DEBUGLOG(7, "testing match %u => offCode=%4u, mlen=%2u, llen=%2u", + DEBUGLOG(7, "testing match %u => offBase=%4u, mlen=%2u, llen=%2u", matchNb, matches[matchNb].off, lastML, litlen); for (mlen = lastML; mlen >= startML; mlen--) { /* scan downward */ @@ -1287,7 +1287,7 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ for (storePos=storeStart; storePos <= storeEnd; storePos++) { U32 const llen = opt[storePos].litlen; U32 const mlen = opt[storePos].mlen; - U32 const offCode = opt[storePos].off; + U32 const offBase = opt[storePos].off; U32 const advance = llen + mlen; DEBUGLOG(6, "considering seq starting at %zi, llen=%u, mlen=%u", anchor - istart, (unsigned)llen, (unsigned)mlen); @@ -1299,8 +1299,8 @@ _shortestPath: /* cur, last_pos, best_mlen, best_off have to be set */ } assert(anchor + llen <= iend); - ZSTD_updateStats(optStatePtr, llen, anchor, offCode, mlen); - ZSTD_storeSeq(seqStore, llen, anchor, iend, offCode, mlen); + ZSTD_updateStats(optStatePtr, llen, anchor, offBase, mlen); + ZSTD_storeSeq(seqStore, llen, anchor, iend, offBase, mlen); anchor += advance; ip = anchor; } } diff --git a/tests/decodecorpus.c b/tests/decodecorpus.c index 1037a3659..d2b126f39 100644 --- a/tests/decodecorpus.c +++ b/tests/decodecorpus.c @@ -671,7 +671,7 @@ generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, : 0; /* actual offset, code to send, and point to copy up to when shifting * codes in the repeat offsets history */ - U32 offset, offsetCode, repIndex; + U32 offset, offBase, repIndex; /* bounds checks */ matchLen = (U32) MIN(matchLen, excessMatch + MIN_SEQ_LEN); @@ -707,12 +707,12 @@ generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, } } } - offsetCode = STORE_OFFSET(offset); + offBase = OFFSET_TO_OFFBASE(offset); repIndex = 2; } else { /* do a repeat offset */ U32 const randomRepIndex = RAND(seed) % 3; - offsetCode = STORE_REPCODE(randomRepIndex + 1); /* expects values between 1 & 3 */ + offBase = REPCODE_TO_OFFBASE(randomRepIndex + 1); /* expects values between 1 & 3 */ if (literalLen > 0) { offset = frame->stats.rep[randomRepIndex]; repIndex = randomRepIndex; @@ -751,12 +751,12 @@ generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, DISPLAYLEVEL(7, " srcPos: %8u seqNb: %3u", (unsigned)((BYTE*)srcPtr - (BYTE*)frame->srcStart), (unsigned)i); DISPLAYLEVEL(6, "\n"); - if (STORED_IS_REPCODE(offsetCode)) { /* expects sumtype numeric representation of ZSTD_storeSeq() */ + if (OFFBASE_IS_REPCODE(offBase)) { /* expects sumtype numeric representation of ZSTD_storeSeq() */ DISPLAYLEVEL(7, " repeat offset: %d\n", (int)repIndex); } /* use libzstd sequence handling */ ZSTD_storeSeq(seqStore, literalLen, literals, literals + literalLen, - offsetCode, matchLen); + offBase, matchLen); literalsSize -= literalLen; excessMatch -= (matchLen - MIN_SEQ_LEN); @@ -765,8 +765,8 @@ generateSequences(U32* seed, frame_t* frame, seqStore_t* seqStore, memcpy(srcPtr, literals, literalsSize); srcPtr += literalsSize; - DISPLAYLEVEL(6, " excess literals: %5u", (unsigned)literalsSize); - DISPLAYLEVEL(7, " srcPos: %8u", (unsigned)((BYTE*)srcPtr - (BYTE*)frame->srcStart)); + DISPLAYLEVEL(6, " excess literals: %5u ", (unsigned)literalsSize); + DISPLAYLEVEL(7, "srcPos: %8u ", (unsigned)((BYTE*)srcPtr - (BYTE*)frame->srcStart)); DISPLAYLEVEL(6, "\n"); return numSequences; diff --git a/tests/fuzzer.c b/tests/fuzzer.c index d168d6576..823db775f 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -3283,8 +3283,7 @@ static int basicUnitTests(U32 const seed, double compressibility) { U32 u; for (u = 0; u < CNBuffSize; ++u) { ((BYTE*)CNBuffer)[u] = 255 - ((BYTE*)CNBuffer)[u]; - } - } + } } { /* Compress the data */ size_t const inputSize = 500; size_t const outputSize = ZSTD_compressBound(inputSize); From 03903f57012054852c0c26daca7131a130bb5cbf Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 29 Dec 2021 18:51:03 -0800 Subject: [PATCH 003/472] fixed minor compression difference in btlazy2 subtle dependency on sumtype numeric representation --- contrib/seekable_format/zstdseek_decompress.c | 53 ++++++++++++++++++- lib/compress/zstd_lazy.c | 24 ++++----- tests/regression/.gitignore | 1 + 3 files changed, 65 insertions(+), 13 deletions(-) diff --git a/contrib/seekable_format/zstdseek_decompress.c b/contrib/seekable_format/zstdseek_decompress.c index 5eed02495..0848d2519 100644 --- a/contrib/seekable_format/zstdseek_decompress.c +++ b/contrib/seekable_format/zstdseek_decompress.c @@ -23,13 +23,64 @@ # endif #endif +/* ************************************************************ +* Detect POSIX version +* PLATFORM_POSIX_VERSION = 0 for non-Unix e.g. Windows +* PLATFORM_POSIX_VERSION = 1 for Unix-like but non-POSIX +* PLATFORM_POSIX_VERSION > 1 is equal to found _POSIX_VERSION +* Value of PLATFORM_POSIX_VERSION can be forced on command line +***************************************************************/ +#ifndef PLATFORM_POSIX_VERSION + +# if (defined(__APPLE__) && defined(__MACH__)) || defined(__SVR4) || defined(_AIX) || defined(__hpux) /* POSIX.1-2001 (SUSv3) conformant */ \ + || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) /* BSD distros */ + /* exception rule : force posix version to 200112L, + * note: it's better to use unistd.h's _POSIX_VERSION whenever possible */ +# define PLATFORM_POSIX_VERSION 200112L + +/* try to determine posix version through official unistd.h's _POSIX_VERSION (http://pubs.opengroup.org/onlinepubs/7908799/xsh/unistd.h.html). + * note : there is no simple way to know in advance if is present or not on target system, + * Posix specification mandates its presence and its content, but target system must respect this spec. + * It's necessary to _not_ #include whenever target OS is not unix-like + * otherwise it will block preprocessing stage. + * The following list of build macros tries to "guess" if target OS is likely unix-like, and therefore can #include + */ +# elif !defined(_WIN32) \ + && ( defined(__unix__) || defined(__unix) \ + || defined(__midipix__) || defined(__VMS) || defined(__HAIKU__) ) + +# if defined(__linux__) || defined(__linux) || defined(__CYGWIN__) +# ifndef _POSIX_C_SOURCE +# define _POSIX_C_SOURCE 200809L /* feature test macro : https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html */ +# endif +# endif +# include /* declares _POSIX_VERSION */ +# if defined(_POSIX_VERSION) /* POSIX compliant */ +# define PLATFORM_POSIX_VERSION _POSIX_VERSION +# else +# define PLATFORM_POSIX_VERSION 1 +# endif + +# ifdef __UCLIBC__ +# ifndef __USE_MISC +# define __USE_MISC /* enable st_mtim on uclibc */ +# endif +# endif + +# else /* non-unix target platform (like Windows) */ +# define PLATFORM_POSIX_VERSION 0 +# endif + +#endif /* PLATFORM_POSIX_VERSION */ + + /* ************************************************************ * Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW ***************************************************************/ #if defined(_MSC_VER) && _MSC_VER >= 1400 # define LONG_SEEK _fseeki64 #elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ -# define LONG_SEEK fseeko +# define LONG_SEEK fseeko #elif defined(__MINGW32__) && !defined(__STRICT_ANSI__) && !defined(__NO_MINGW_LFS) && defined(__MSVCRT__) # define LONG_SEEK fseeko64 #elif defined(_WIN32) && !defined(__DJGPP__) diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 2a0cfc893..47c0687c9 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -230,7 +230,7 @@ ZSTD_DUBT_findBetterDictMatch ( static size_t ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iend, - size_t* offsetPtr, + size_t* offBasePtr, U32 const mls, const ZSTD_dictMode_e dictMode) { @@ -327,8 +327,8 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, if (matchLength > bestLength) { if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; - if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) - bestLength = matchLength, *offsetPtr = OFFSET_TO_OFFBASE(curr - matchIndex); + if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(curr - matchIndex + 1) - ZSTD_highbit32((U32)*offBasePtr)) ) + bestLength = matchLength, *offBasePtr = OFFSET_TO_OFFBASE(curr - matchIndex); if (ip+matchLength == iend) { /* equal : no way to know if inf or sup */ if (dictMode == ZSTD_dictMatchState) { nbCompares = 0; /* in addition to avoiding checking any @@ -361,16 +361,16 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, if (dictMode == ZSTD_dictMatchState && nbCompares) { bestLength = ZSTD_DUBT_findBetterDictMatch( ms, ip, iend, - offsetPtr, bestLength, nbCompares, + offBasePtr, bestLength, nbCompares, mls, dictMode); } assert(matchEndIdx > curr+8); /* ensure nextToUpdate is increased */ ms->nextToUpdate = matchEndIdx - 8; /* skip repetitive patterns */ if (bestLength >= MINMATCH) { - U32 const mIndex = curr - (U32)OFFBASE_TO_OFFSET(*offsetPtr); (void)mIndex; + U32 const mIndex = curr - (U32)OFFBASE_TO_OFFSET(*offBasePtr); (void)mIndex; DEBUGLOG(8, "ZSTD_DUBT_findBestMatch(%u) : found match of length %u and offsetCode %u (pos %u)", - curr, (U32)bestLength, (U32)*offsetPtr, mIndex); + curr, (U32)bestLength, (U32)*offBasePtr, mIndex); } return bestLength; } @@ -381,14 +381,14 @@ ZSTD_DUBT_findBestMatch(ZSTD_matchState_t* ms, FORCE_INLINE_TEMPLATE size_t ZSTD_BtFindBestMatch( ZSTD_matchState_t* ms, const BYTE* const ip, const BYTE* const iLimit, - size_t* offsetPtr, + size_t* offBasePtr, const U32 mls /* template */, const ZSTD_dictMode_e dictMode) { DEBUGLOG(7, "ZSTD_BtFindBestMatch"); if (ip < ms->window.base + ms->nextToUpdate) return 0; /* skipped area */ ZSTD_updateDUBT(ms, ip, iLimit, mls); - return ZSTD_DUBT_findBestMatch(ms, ip, iLimit, offsetPtr, mls, dictMode); + return ZSTD_DUBT_findBestMatch(ms, ip, iLimit, offBasePtr, mls, dictMode); } /*********************************** @@ -1337,10 +1337,10 @@ typedef struct { static size_t ZSTD_BtFindBestMatch_##dictMode##_##mls( \ ZSTD_matchState_t* ms, \ const BYTE* ip, const BYTE* const iLimit, \ - size_t* offsetPtr) \ + size_t* offBasePtr) \ { \ assert(MAX(4, MIN(6, ms->cParams.minMatch)) == mls); \ - return ZSTD_BtFindBestMatch(ms, ip, iLimit, offsetPtr, mls, ZSTD_##dictMode); \ + return ZSTD_BtFindBestMatch(ms, ip, iLimit, offBasePtr, mls, ZSTD_##dictMode);\ } \ static const ZSTD_LazyVTable ZSTD_BtVTable_##dictMode##_##mls = { \ ZSTD_BtFindBestMatch_##dictMode##_##mls \ @@ -1959,7 +1959,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( } } /* search match, depth 1 */ - { size_t ofbCandidate=999999999; + { size_t ofbCandidate = 999999999; size_t const ml2 = searchMax(ms, ip, iend, &ofbCandidate); int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 4); @@ -1991,7 +1991,7 @@ size_t ZSTD_compressBlock_lazy_extDict_generic( } } /* search match, depth 2 */ - { size_t ofbCandidate=999999999; + { size_t ofbCandidate = 999999999; size_t const ml2 = searchMax(ms, ip, iend, &ofbCandidate); int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)ofbCandidate)); /* raw approx */ int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offBase) + 7); diff --git a/tests/regression/.gitignore b/tests/regression/.gitignore index 1b2618f41..3da209d40 100644 --- a/tests/regression/.gitignore +++ b/tests/regression/.gitignore @@ -1,3 +1,4 @@ # regression test artifacts data-cache +cache test From 9e1b4828e56a028efa0efdd7c30a58e6dd48c8c1 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 7 Jan 2022 13:51:28 -0800 Subject: [PATCH 004/472] enforce a minimum price of 1 bit per literal in the optimal parser --- lib/compress/zstd_opt.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/compress/zstd_opt.c b/lib/compress/zstd_opt.c index 1b1ddad42..2c48ae55e 100644 --- a/lib/compress/zstd_opt.c +++ b/lib/compress/zstd_opt.c @@ -255,11 +255,13 @@ static U32 ZSTD_rawLiteralsCost(const BYTE* const literals, U32 const litLength, return (litLength*6) * BITCOST_MULTIPLIER; /* 6 bit per literal - no statistic used */ /* dynamic statistics */ - { U32 price = litLength * optPtr->litSumBasePrice; + { U32 price = 0; U32 u; for (u=0; u < litLength; u++) { + U32 litPrice = optPtr->litSumBasePrice - WEIGHT(optPtr->litFreq[literals[u]], optLevel); assert(WEIGHT(optPtr->litFreq[literals[u]], optLevel) <= optPtr->litSumBasePrice); /* literal cost should never be negative */ - price -= WEIGHT(optPtr->litFreq[literals[u]], optLevel); + if (litPrice < BITCOST_MULTIPLIER) litPrice = BITCOST_MULTIPLIER; + price += litPrice; } return price; } From ca0135c2fd562058a099a20bb0c2e569d354f08b Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 7 Jan 2022 14:37:53 -0800 Subject: [PATCH 005/472] new Formulation presumes faster --- lib/compress/zstd_opt.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/compress/zstd_opt.c b/lib/compress/zstd_opt.c index 2c48ae55e..143e101a6 100644 --- a/lib/compress/zstd_opt.c +++ b/lib/compress/zstd_opt.c @@ -255,13 +255,14 @@ static U32 ZSTD_rawLiteralsCost(const BYTE* const literals, U32 const litLength, return (litLength*6) * BITCOST_MULTIPLIER; /* 6 bit per literal - no statistic used */ /* dynamic statistics */ - { U32 price = 0; + { U32 price = optPtr->litSumBasePrice * litLength; + U32 const litPriceMax = optPtr->litSumBasePrice - BITCOST_MULTIPLIER; U32 u; + assert(optPtr->litSumBasePrice >= BITCOST_MULTIPLIER); for (u=0; u < litLength; u++) { - U32 litPrice = optPtr->litSumBasePrice - WEIGHT(optPtr->litFreq[literals[u]], optLevel); - assert(WEIGHT(optPtr->litFreq[literals[u]], optLevel) <= optPtr->litSumBasePrice); /* literal cost should never be negative */ - if (litPrice < BITCOST_MULTIPLIER) litPrice = BITCOST_MULTIPLIER; - price += litPrice; + U32 litPrice = WEIGHT(optPtr->litFreq[literals[u]], optLevel); + if (UNLIKELY(litPrice > litPriceMax)) litPrice = litPriceMax; + price -= litPrice; } return price; } From 5595aec6294541075e8978d26cfb86dd3cefc3c3 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 7 Jan 2022 15:08:06 -0800 Subject: [PATCH 006/472] updated regression results --- tests/regression/results.csv | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/regression/results.csv b/tests/regression/results.csv index f43129e6c..3385c5049 100644 --- a/tests/regression/results.csv +++ b/tests/regression/results.csv @@ -46,7 +46,7 @@ silesia, level 7, compress silesia, level 9, compress cctx, 4543018 silesia, level 13, compress cctx, 4493990 silesia, level 16, compress cctx, 4359864 -silesia, level 19, compress cctx, 4296880 +silesia, level 19, compress cctx, 4296686 silesia, long distance mode, compress cctx, 4842075 silesia, multithreaded, compress cctx, 4842075 silesia, multithreaded long distance mode, compress cctx, 4842075 @@ -55,7 +55,7 @@ silesia, small hash log, compress silesia, small chain log, compress cctx, 4912197 silesia, explicit params, compress cctx, 4794052 silesia, uncompressed literals, compress cctx, 4842075 -silesia, uncompressed literals optimal, compress cctx, 4296880 +silesia, uncompressed literals optimal, compress cctx, 4296686 silesia, huffman literals, compress cctx, 6172178 silesia, multithreaded with advanced params, compress cctx, 4842075 github, level -5, compress cctx, 204411 @@ -110,7 +110,7 @@ silesia, level 7, zstdcli, silesia, level 9, zstdcli, 4543066 silesia, level 13, zstdcli, 4494038 silesia, level 16, zstdcli, 4359912 -silesia, level 19, zstdcli, 4296928 +silesia, level 19, zstdcli, 4296734 silesia, long distance mode, zstdcli, 4833785 silesia, multithreaded, zstdcli, 4842123 silesia, multithreaded long distance mode, zstdcli, 4833785 @@ -249,7 +249,7 @@ silesia, level 12 row 1, advanced silesia, level 12 row 2, advanced one pass, 4503116 silesia, level 13, advanced one pass, 4493990 silesia, level 16, advanced one pass, 4359864 -silesia, level 19, advanced one pass, 4296880 +silesia, level 19, advanced one pass, 4296686 silesia, no source size, advanced one pass, 4842075 silesia, long distance mode, advanced one pass, 4833710 silesia, multithreaded, advanced one pass, 4842075 @@ -567,7 +567,7 @@ silesia, level 12 row 1, advanced silesia, level 12 row 2, advanced one pass small out, 4503116 silesia, level 13, advanced one pass small out, 4493990 silesia, level 16, advanced one pass small out, 4359864 -silesia, level 19, advanced one pass small out, 4296880 +silesia, level 19, advanced one pass small out, 4296686 silesia, no source size, advanced one pass small out, 4842075 silesia, long distance mode, advanced one pass small out, 4833710 silesia, multithreaded, advanced one pass small out, 4842075 @@ -885,7 +885,7 @@ silesia, level 12 row 1, advanced silesia, level 12 row 2, advanced streaming, 4503116 silesia, level 13, advanced streaming, 4493990 silesia, level 16, advanced streaming, 4359864 -silesia, level 19, advanced streaming, 4296880 +silesia, level 19, advanced streaming, 4296686 silesia, no source size, advanced streaming, 4842039 silesia, long distance mode, advanced streaming, 4833710 silesia, multithreaded, advanced streaming, 4842075 @@ -1195,10 +1195,10 @@ silesia, level 7, old stre silesia, level 9, old streaming, 4543018 silesia, level 13, old streaming, 4493990 silesia, level 16, old streaming, 4359864 -silesia, level 19, old streaming, 4296880 +silesia, level 19, old streaming, 4296686 silesia, no source size, old streaming, 4842039 silesia, uncompressed literals, old streaming, 4842075 -silesia, uncompressed literals optimal, old streaming, 4296880 +silesia, uncompressed literals optimal, old streaming, 4296686 silesia, huffman literals, old streaming, 6179294 silesia.tar, level -5, old streaming, 7043687 silesia.tar, level -3, old streaming, 6671317 @@ -1297,7 +1297,7 @@ silesia, level 7, old stre silesia, level 9, old streaming advanced, 4543018 silesia, level 13, old streaming advanced, 4493990 silesia, level 16, old streaming advanced, 4359864 -silesia, level 19, old streaming advanced, 4296880 +silesia, level 19, old streaming advanced, 4296686 silesia, no source size, old streaming advanced, 4842039 silesia, long distance mode, old streaming advanced, 4842075 silesia, multithreaded, old streaming advanced, 4842075 @@ -1307,7 +1307,7 @@ silesia, small hash log, old stre silesia, small chain log, old streaming advanced, 4912197 silesia, explicit params, old streaming advanced, 4795452 silesia, uncompressed literals, old streaming advanced, 4842075 -silesia, uncompressed literals optimal, old streaming advanced, 4296880 +silesia, uncompressed literals optimal, old streaming advanced, 4296686 silesia, huffman literals, old streaming advanced, 6179294 silesia, multithreaded with advanced params, old streaming advanced, 4842075 silesia.tar, level -5, old streaming advanced, 7043687 From df5013b4632eda82a0cc745969ca305ac55dfe36 Mon Sep 17 00:00:00 2001 From: Yonatan Komornik Date: Fri, 7 Jan 2022 15:55:19 -0800 Subject: [PATCH 007/472] ZSTD CLI: Use buffered output for improved performance --- programs/fileio.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/programs/fileio.c b/programs/fileio.c index 379d334eb..9945daa46 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -718,6 +718,17 @@ FIO_openDstFile(FIO_ctx_t* fCtx, FIO_prefs_t* const prefs, if (f == NULL) { DISPLAYLEVEL(1, "zstd: %s: %s\n", dstFileName, strerror(errno)); } + /* An increased buffer size can provide a significant performance boost on some platforms. + * Note that providing a NULL buf with a size that's not 0 is not defined in ANSI C, but is defined + * in an extension. There are three possibilities here - + * 1. Libc supports the extended version and everything is good. + * 2. Libc ignores the size when buf is NULL, in which case everything will continue as if we didn't + * call `setvbuf`. + * 3. We fail the call and execution continues but a warning message might be shown. + * In all cases due execution continues. For now, I believe that this is a more cost-effective + * solution than managing the buffers allocations ourselves (will require an API change). */ + if(setvbuf(f, NULL, _IOFBF, 1 MB)) + DISPLAYLEVEL(2, "Warning: setvbuf failed for %s\n", dstFileName); return f; } } From 51ab182bd4af347b08fd1b9df179078c4f596e24 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 11 Jan 2022 07:28:25 -0800 Subject: [PATCH 008/472] x86-64: Enable Intel CET Intel Control-flow Enforcement Technology (CET): https://en.wikipedia.org/wiki/Control-flow_integrity#Intel_Control-flow_Enforcement_Technology requires that on Linux, all linker input files are marked as CET enabled in .note.gnu.property section. For high-level language source codes, .note.gnu.property section is added by compiler with the -fcf-protection option. For assembly sources, include to add .note.gnu.property section. --- lib/common/portability_macros.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/common/portability_macros.h b/lib/common/portability_macros.h index 2143817f5..23a650885 100644 --- a/lib/common/portability_macros.h +++ b/lib/common/portability_macros.h @@ -134,4 +134,15 @@ # define ZSTD_ENABLE_ASM_X86_64_BMI2 0 #endif +/* + * For x86 ELF targets, add .note.gnu.property section for Intel CET in + * assembly sources when CET is enabled. + */ +#if defined(__ELF__) && (defined(__x86_64__) || defined(__i386__)) \ + && defined(__has_include) +# if __has_include() +# include +# endif +#endif + #endif /* ZSTD_PORTABILITY_MACROS_H */ From 7e50d1e8c167d8f3fb0ae01e05826da78acdccf9 Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Mon, 17 Jan 2022 18:59:54 +0100 Subject: [PATCH 009/472] Using faster Python script to amalgamate --- build/single_file_libs/combine.py | 156 ++++++++++++++++++ .../create_single_file_decoder.sh | 7 +- .../create_single_file_library.sh | 7 +- 3 files changed, 168 insertions(+), 2 deletions(-) create mode 100755 build/single_file_libs/combine.py diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py new file mode 100755 index 000000000..994b36b1d --- /dev/null +++ b/build/single_file_libs/combine.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 + +# Tool to bundle multiple C/C++ source files, inlining any includes. +# +# Author: Carl Woffenden, Numfum GmbH (this script is released under a CC0 license/Public Domain) + +import argparse, os, re, sys + +from pathlib import Path + +# File roots when searching (equivalent to -I paths for the compiler). +roots = set() + +# File Path objects previously inlined. +found = set() + +# Destination file object (or stdout if no output file was supplied). +destn = None + +# Regex to handle the following type of file includes: +# +# #include "file" +# #include "file" +# # include "file" +# #include "file" +# #include "file" // comment +# #include "file" // comment with quote " +# +# And all combinations of, as well as ignoring the following: +# +# #include +# //#include "file" +# /*#include "file"*/ +# +# We don't try to catch errors since the compiler will do this (and the code is +# expected to be valid before processing) and we don't care what follows the +# file (whether it's a valid comment or not, since anything after the quoted +# string is ignored) +# +include_regex = re.compile(r'^\s*#\s*include\s*"(.+?)"') + +# Simple tests to prove include_regex's cases. +# +def test_match_include(): + if (include_regex.match('#include "file"') and + include_regex.match(' #include "file"') and + include_regex.match('# include "file"') and + include_regex.match('#include "file"') and + include_regex.match('#include "file" // comment')): + if (not include_regex.match('#include ') and + not include_regex.match('//#include "file"') and + not include_regex.match('/*#include "file"*/')): + found = include_regex.match('#include "file" // "') + if (found and found.group(1) == 'file'): + print('#include match valid') + return True + return False + +# Regex to handle "#pragma once" in various formats: +# +# #pragma once +# #pragma once +# # pragma once +# #pragma once +# #pragma once // comment +# +# Ignoring commented versions, same as include_regex. +# +pragma_regex = re.compile(r'^\s*#\s*pragma\s*once\s*') + +# Simple tests to prove pragma_regex's cases. +# +def text_match_pragma(): + if (pragma_regex.match('#pragma once') and + pragma_regex.match(' #pragma once') and + pragma_regex.match('# pragma once') and + pragma_regex.match('#pragma once') and + pragma_regex.match('#pragma once // comment')): + if (not pragma_regex.match('//#pragma once') and + not pragma_regex.match('/*#pragma once*/')): + print('#pragma once match valid') + return True + return False + +# Finds 'file'. First the currently processing file's 'parent' path is looked at +# for a match, followed by the list of 'root', returning a valid Path in +# canonical form. If no match is found None is returned. +# +def resolve_include(parent: Path, file: str): + found = parent.joinpath(file).resolve(); + if (found.is_file()): + return found + for root in roots: + found = root.joinpath(file).resolve() + if (found.is_file()): + return found + return None + +# Writes 'line' to the open file 'destn' (or stdout). +# +def write_line(line): + print(line, file=destn) + +# Logs 'line' to stderr. +# +def log_line(line): + print(line, file=sys.stderr) + +def add_file(file): + if (isinstance(file, Path) and file.is_file()): + log_line(f'Processing: {file}') + with file.open('r') as opened: + for line in opened: + line = line.rstrip('\n') + match_include = include_regex.match(line); + if (match_include): + inc_name = match_include.group(1) + resolved = resolve_include(file.parent, inc_name) + if (resolved not in found): + # The file was not previously encountered + found.add(resolved) + write_line(f'/**** start inlining {inc_name} ****/') + add_file(resolved) + write_line(f'/**** ended inlining {inc_name} ****/') + else: + write_line(f'/**** skipping file: {inc_name} ****/') + else: + if (not pragma_regex.match(line)): + write_line(line) + else: + log_line(f'Error: Unable to find: {file}') + + +parser = argparse.ArgumentParser(description='Amalgamate Tool', epilog=f'example: {sys.argv[0]} -r ../my/path -r ../other/path -o out.c in.c') +parser.add_argument('-r', '--root', action='append', type=Path, help='file root search path') +parser.add_argument('-x', '--exclude', action='append', help='file to completely exclude from inlining') +parser.add_argument('-k', '--keep', action='append', help='file to exclude from inlining but keep the include directive') +parser.add_argument('-p', '--pragma', action='store_true', default=False, help='keep any "#pragma once" directives (removed by default)') +parser.add_argument('-o', '--output', type=argparse.FileType('w'), help='output file (otherwise stdout)') +parser.add_argument('input', type=Path, help='input file') +args = parser.parse_args() + +# Resolve all of the root paths upfront (we'll halt here on invalid roots) +if (args.root is not None): + for path in args.root: + roots.add(path.resolve(strict=True)) + +try: + if (args.output is None): + destn = sys.stdout + else: + destn = args.output + add_file(args.input) +finally: + if (destn is not None): + destn.close() diff --git a/build/single_file_libs/create_single_file_decoder.sh b/build/single_file_libs/create_single_file_decoder.sh index b5f5613ae..1c8841d18 100755 --- a/build/single_file_libs/create_single_file_decoder.sh +++ b/build/single_file_libs/create_single_file_decoder.sh @@ -5,7 +5,12 @@ ZSTD_SRC_ROOT="../../lib" # Amalgamate the sources echo "Amalgamating files... this can take a while" -./combine.sh -r "$ZSTD_SRC_ROOT" -o zstddeclib.c zstddeclib-in.c +# Using the faster Python script if we have 3.8 or higher +if python3 -c 'import sys; assert sys.version_info >= (3,8)' 2>/dev/null; then + ./combine.py -r "$ZSTD_SRC_ROOT" -o zstddeclib.c zstddeclib-in.c +else + ./combine.sh -r "$ZSTD_SRC_ROOT" -o zstddeclib.c zstddeclib-in.c +fi # Did combining work? if [ $? -ne 0 ]; then echo "Combine script: FAILED" diff --git a/build/single_file_libs/create_single_file_library.sh b/build/single_file_libs/create_single_file_library.sh index 6f38526d5..9b2f22a9d 100755 --- a/build/single_file_libs/create_single_file_library.sh +++ b/build/single_file_libs/create_single_file_library.sh @@ -5,7 +5,12 @@ ZSTD_SRC_ROOT="../../lib" # Amalgamate the sources echo "Amalgamating files... this can take a while" -./combine.sh -r "$ZSTD_SRC_ROOT" -o zstd.c zstd-in.c +# Using the faster Python script if we have 3.8 or higher +if python3 -c 'import sys; assert sys.version_info >= (3,8)' 2>/dev/null; then + ./combine.py -r "$ZSTD_SRC_ROOT" -o zstd.c zstd-in.c +else + ./combine.sh -r "$ZSTD_SRC_ROOT" -o zstd.c zstd-in.c +fi # Did combining work? if [ $? -ne 0 ]; then echo "Combine script: FAILED" From 829ac2e9cedb0b360cfee9d7df88ed44e677ef20 Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Tue, 18 Jan 2022 11:43:01 +0100 Subject: [PATCH 010/472] Work-in-progress; annotated types, added docs, parsed and resolved excluded files --- build/single_file_libs/combine.py | 66 +++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index 994b36b1d..4dd3a0720 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -4,20 +4,27 @@ # # Author: Carl Woffenden, Numfum GmbH (this script is released under a CC0 license/Public Domain) -import argparse, os, re, sys +import argparse, io, os, re, sys from pathlib import Path -# File roots when searching (equivalent to -I paths for the compiler). +# Set of file roots when searching (equivalent to -I paths for the compiler). roots = set() -# File Path objects previously inlined. +# Set of (canonical) file Path objects to exclude from inlining (and not only +# exclude but to add a compiler error directive when they're encountered). +excludes = set() + +# Set of (canonical) file Path objects to keep as include directives. +keeps = set() + +# Set of file Path objects previously inlined. found = set() -# Destination file object (or stdout if no output file was supplied). +# Destination file TextIOBase object (or stdout if no output file was supplied). destn = None -# Regex to handle the following type of file includes: +# Compiled regex Patern to handle the following type of file includes: # # #include "file" # #include "file" @@ -41,7 +48,7 @@ include_regex = re.compile(r'^\s*#\s*include\s*"(.+?)"') # Simple tests to prove include_regex's cases. # -def test_match_include(): +def test_match_include() -> bool: if (include_regex.match('#include "file"') and include_regex.match(' #include "file"') and include_regex.match('# include "file"') and @@ -56,7 +63,7 @@ def test_match_include(): return True return False -# Regex to handle "#pragma once" in various formats: +# Compiled regex Patern to handle "#pragma once" in various formats: # # #pragma once # #pragma once @@ -70,7 +77,7 @@ pragma_regex = re.compile(r'^\s*#\s*pragma\s*once\s*') # Simple tests to prove pragma_regex's cases. # -def text_match_pragma(): +def text_match_pragma() -> bool: if (pragma_regex.match('#pragma once') and pragma_regex.match(' #pragma once') and pragma_regex.match('# pragma once') and @@ -83,10 +90,10 @@ def text_match_pragma(): return False # Finds 'file'. First the currently processing file's 'parent' path is looked at -# for a match, followed by the list of 'root', returning a valid Path in +# for a match, followed by the list of 'root' paths, returning a valid Path in # canonical form. If no match is found None is returned. # -def resolve_include(parent: Path, file: str): +def resolve_include(parent: Path, file: str) -> Path: found = parent.joinpath(file).resolve(); if (found.is_file()): return found @@ -98,15 +105,17 @@ def resolve_include(parent: Path, file: str): # Writes 'line' to the open file 'destn' (or stdout). # -def write_line(line): +def write_line(line: str) -> None: print(line, file=destn) # Logs 'line' to stderr. # -def log_line(line): +def log_line(line: str) -> None: print(line, file=sys.stderr) -def add_file(file): +# Adds the contents of 'file' with any of its includes inlined. +# +def add_file(file: Path) -> None: if (isinstance(file, Path) and file.is_file()): log_line(f'Processing: {file}') with file.open('r') as opened: @@ -129,8 +138,8 @@ def add_file(file): write_line(line) else: log_line(f'Error: Unable to find: {file}') - +# Start here parser = argparse.ArgumentParser(description='Amalgamate Tool', epilog=f'example: {sys.argv[0]} -r ../my/path -r ../other/path -o out.c in.c') parser.add_argument('-r', '--root', action='append', type=Path, help='file root search path') parser.add_argument('-x', '--exclude', action='append', help='file to completely exclude from inlining') @@ -140,17 +149,40 @@ parser.add_argument('-o', '--output', type=argparse.FileType('w'), help='output parser.add_argument('input', type=Path, help='input file') args = parser.parse_args() +# Fail early on an invalid input (and store it so we don't recurse) +args.input = args.input.resolve(strict=True) +found.add(args.input) + # Resolve all of the root paths upfront (we'll halt here on invalid roots) -if (args.root is not None): +if (args.root): for path in args.root: roots.add(path.resolve(strict=True)) +# Resolve the excluded files +if (args.exclude): + for filename in args.exclude: + resolved = resolve_include(args.input.parent, filename) + if (resolved): + excludes.add(resolved) + else: + log_line(f'Warning: excluded file not found: {filename}') + +# And the files to keep +if (args.keep): + for filename in args.keep: + resolved = resolve_include(args.input.parent, filename) + if (resolved): + keeps.add(resolved) + else: + log_line(f'Warning: kept #include not found: {filename}') + +# Then recursively process the input file try: - if (args.output is None): + if (not args.output): destn = sys.stdout else: destn = args.output add_file(args.input) finally: - if (destn is not None): + if (not destn): destn.close() From 8f1e51f99fa6ca6d132e53e58265b4d79d2fbb2b Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Tue, 18 Jan 2022 19:07:18 +0100 Subject: [PATCH 011/472] Feature parity with original shell script; needs further testing --- build/single_file_libs/combine.py | 123 ++++++++++++++++++------------ 1 file changed, 75 insertions(+), 48 deletions(-) diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index 4dd3a0720..00a6f11f7 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -4,25 +4,30 @@ # # Author: Carl Woffenden, Numfum GmbH (this script is released under a CC0 license/Public Domain) -import argparse, io, os, re, sys +import argparse, re, sys from pathlib import Path +from typing import Any, List, Optional, Pattern, Set, TextIO # Set of file roots when searching (equivalent to -I paths for the compiler). -roots = set() +roots: Set[Path] = set() # Set of (canonical) file Path objects to exclude from inlining (and not only # exclude but to add a compiler error directive when they're encountered). -excludes = set() +excludes: Set[Path] = set() # Set of (canonical) file Path objects to keep as include directives. -keeps = set() +keeps: Set[Path] = set() -# Set of file Path objects previously inlined. -found = set() +# Whether to keep the #pragma once directives (unlikely, since this will result +# in a warning, but the option is there). +keep_pragma: bool = False -# Destination file TextIOBase object (or stdout if no output file was supplied). -destn = None +# Destination file object (or stdout if no output file was supplied). +destn:TextIO = sys.stdout + +# Set of file Path objects previously inlined (and to ignore if reencountering). +found: Set[Path] = set() # Compiled regex Patern to handle the following type of file includes: # @@ -44,7 +49,7 @@ destn = None # file (whether it's a valid comment or not, since anything after the quoted # string is ignored) # -include_regex = re.compile(r'^\s*#\s*include\s*"(.+?)"') +include_regex: Pattern = re.compile(r'^\s*#\s*include\s*"(.+?)"') # Simple tests to prove include_regex's cases. # @@ -73,7 +78,7 @@ def test_match_include() -> bool: # # Ignoring commented versions, same as include_regex. # -pragma_regex = re.compile(r'^\s*#\s*pragma\s*once\s*') +pragma_regex: Pattern = re.compile(r'^\s*#\s*pragma\s*once\s*') # Simple tests to prove pragma_regex's cases. # @@ -93,8 +98,11 @@ def text_match_pragma() -> bool: # for a match, followed by the list of 'root' paths, returning a valid Path in # canonical form. If no match is found None is returned. # -def resolve_include(parent: Path, file: str) -> Path: - found = parent.joinpath(file).resolve(); +def resolve_include(file: str, parent: Optional[Path] = None) -> Optional[Path]: + if (parent): + found = parent.joinpath(file).resolve(); + else: + found = Path(file) if (found.is_file()): return found for root in roots: @@ -103,41 +111,75 @@ def resolve_include(parent: Path, file: str) -> Path: return found return None -# Writes 'line' to the open file 'destn' (or stdout). +# Helper to resolve lists of files. 'file_list' is passed in from the arguments +# and each entry resolved to its canonical path (like any include entry, either +# from the list of root paths or the owning file's 'parent', which in this case +# is case is the input file). The results are stored in 'resolved'. +# +def resolve_files(file_list: Optional[List[str]], resolved: Set[Path], parent: Optional[Path] = None) -> None: + if (file_list): + for filename in file_list: + found = resolve_include(filename, parent) + if (found): + resolved.add(found) + else: + error_line(f'Warning: excluded file not found: {filename}') + +# Writes 'line' to the open 'destn' (or stdout). # def write_line(line: str) -> None: print(line, file=destn) -# Logs 'line' to stderr. +# Logs 'line' to stderr. This is also used for general notifications that we +# don't want to go to stdout (so the source can be piped). # -def log_line(line: str) -> None: +def error_line(line: Any) -> None: print(line, file=sys.stderr) -# Adds the contents of 'file' with any of its includes inlined. +# Inline the contents of 'file' (with any of its includes also inlined, etc.). # def add_file(file: Path) -> None: - if (isinstance(file, Path) and file.is_file()): - log_line(f'Processing: {file}') + if (file.is_file()): + error_line(f'Processing: {file}') with file.open('r') as opened: for line in opened: line = line.rstrip('\n') match_include = include_regex.match(line); if (match_include): + # We have a quoted include directive so grab the file inc_name = match_include.group(1) - resolved = resolve_include(file.parent, inc_name) - if (resolved not in found): - # The file was not previously encountered - found.add(resolved) - write_line(f'/**** start inlining {inc_name} ****/') - add_file(resolved) - write_line(f'/**** ended inlining {inc_name} ****/') + resolved = resolve_include(inc_name, file.parent) + if (resolved): + if (resolved in excludes): + # The file was excluded so error if the source attempts to use it + write_line(f'#error Using excluded file: {inc_name}') + error_line(f'Excluding: {inc_name}') + else: + if (resolved not in found): + # The file was not previously encountered + found.add(resolved) + if (resolved in keeps): + # But the include was flagged to keep as included + write_line(f'/**** *NOT* inlining {inc_name} ****/') + write_line(line) + error_line('Not Inlining: {inc_name}') + else: + # The file was neither excluded nor seen before so inline it + write_line(f'/**** start inlining {inc_name} ****/') + add_file(resolved) + write_line(f'/**** ended inlining {inc_name} ****/') + else: + write_line(f'/**** skipping file: {inc_name} ****/') else: - write_line(f'/**** skipping file: {inc_name} ****/') + # The include file didn't resolve to a file + write_line(f'#error Unable to find: {inc_name}') + error_line(f'Error: Unable to find: {inc_name}') else: - if (not pragma_regex.match(line)): + # Skip any 'pragma once' directives, otherwise write the source line + if (keep_pragma or not pragma_regex.match(line)): write_line(line) else: - log_line(f'Error: Unable to find: {file}') + error_line(f'Error: Invalid file: {file}') # Start here parser = argparse.ArgumentParser(description='Amalgamate Tool', epilog=f'example: {sys.argv[0]} -r ../my/path -r ../other/path -o out.c in.c') @@ -158,29 +200,14 @@ if (args.root): for path in args.root: roots.add(path.resolve(strict=True)) -# Resolve the excluded files -if (args.exclude): - for filename in args.exclude: - resolved = resolve_include(args.input.parent, filename) - if (resolved): - excludes.add(resolved) - else: - log_line(f'Warning: excluded file not found: {filename}') - -# And the files to keep -if (args.keep): - for filename in args.keep: - resolved = resolve_include(args.input.parent, filename) - if (resolved): - keeps.add(resolved) - else: - log_line(f'Warning: kept #include not found: {filename}') +# The remaining params: so resolve the excluded files and #pragma once directive +resolve_files(args.exclude, excludes, args.input.parent) +resolve_files(args.keep, keeps, args.input.parent) +keep_pragma = args.pragma; # Then recursively process the input file try: - if (not args.output): - destn = sys.stdout - else: + if (args.output): destn = args.output add_file(args.input) finally: From 7d90f0b520fda6cd9def6cd248c54b075717e948 Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Wed, 19 Jan 2022 11:32:53 +0100 Subject: [PATCH 012/472] Test and tidy Made the Python more Python-like. Added notes and general tidy. Tested exclusions and building with various options. Tested all scripts. --- build/single_file_libs/build_library_test.sh | 2 +- build/single_file_libs/combine.py | 232 ++++++++++-------- build/single_file_libs/combine.sh | 1 + .../create_single_file_decoder.sh | 6 +- .../create_single_file_library.sh | 6 +- build/single_file_libs/zstd-in.c | 2 +- build/single_file_libs/zstddeclib-in.c | 2 +- 7 files changed, 133 insertions(+), 118 deletions(-) diff --git a/build/single_file_libs/build_library_test.sh b/build/single_file_libs/build_library_test.sh index 7fb99656b..31545fc3f 100755 --- a/build/single_file_libs/build_library_test.sh +++ b/build/single_file_libs/build_library_test.sh @@ -69,7 +69,7 @@ fi echo "Single file library creation script: PASSED" # Copy the header to here (for the tests) -cp "$ZSTD_SRC_ROOT/zstd.h" zstd.h +cp "$ZSTD_SRC_ROOT/zstd.h" examples/zstd.h # Compile the generated output cc -Wall -Wextra -Werror -Wshadow -pthread -I. -Os -g0 -o $OUT_FILE zstd.c examples/roundtrip.c diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index 00a6f11f7..0538ccb69 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -2,6 +2,18 @@ # Tool to bundle multiple C/C++ source files, inlining any includes. # +# Note: there are two types of exclusion options: the '-x' flag, which besides +# excluding a file also adds an #error directive in place of the #include, and +# the '-k' flag, which keeps the #include and doesn't inline the file. The +# intended use cases are: '-x' for files that would normally be #if'd out, so +# features that 100% won't be used in the amalgamated file, for which every +# occurrence adds the error, and '-k' for headers that we wish to manually +# include, such as a project's public API, for which occurrences after the first +# are removed. +# +# Todo: the error handling could be better, which currently throws and halts +# (which is functional just not very friendly). +# # Author: Carl Woffenden, Numfum GmbH (this script is released under a CC0 license/Public Domain) import argparse, re, sys @@ -31,18 +43,18 @@ found: Set[Path] = set() # Compiled regex Patern to handle the following type of file includes: # -# #include "file" -# #include "file" -# # include "file" -# #include "file" -# #include "file" // comment -# #include "file" // comment with quote " +# #include "file" +# #include "file" +# # include "file" +# #include "file" +# #include "file" // comment +# #include "file" // comment with quote " # # And all combinations of, as well as ignoring the following: # -# #include -# //#include "file" -# /*#include "file"*/ +# #include +# //#include "file" +# /*#include "file"*/ # # We don't try to catch errors since the compiler will do this (and the code is # expected to be valid before processing) and we don't care what follows the @@ -54,27 +66,27 @@ include_regex: Pattern = re.compile(r'^\s*#\s*include\s*"(.+?)"') # Simple tests to prove include_regex's cases. # def test_match_include() -> bool: - if (include_regex.match('#include "file"') and - include_regex.match(' #include "file"') and - include_regex.match('# include "file"') and - include_regex.match('#include "file"') and - include_regex.match('#include "file" // comment')): - if (not include_regex.match('#include ') and - not include_regex.match('//#include "file"') and - not include_regex.match('/*#include "file"*/')): - found = include_regex.match('#include "file" // "') - if (found and found.group(1) == 'file'): - print('#include match valid') - return True - return False + if (include_regex.match('#include "file"') and + include_regex.match(' #include "file"') and + include_regex.match('# include "file"') and + include_regex.match('#include "file"') and + include_regex.match('#include "file" // comment')): + if (not include_regex.match('#include ') and + not include_regex.match('//#include "file"') and + not include_regex.match('/*#include "file"*/')): + found = include_regex.match('#include "file" // "') + if (found and found.group(1) == 'file'): + print('#include match valid') + return True + return False # Compiled regex Patern to handle "#pragma once" in various formats: # -# #pragma once -# #pragma once -# # pragma once -# #pragma once -# #pragma once // comment +# #pragma once +# #pragma once +# # pragma once +# #pragma once +# #pragma once // comment # # Ignoring commented versions, same as include_regex. # @@ -83,103 +95,105 @@ pragma_regex: Pattern = re.compile(r'^\s*#\s*pragma\s*once\s*') # Simple tests to prove pragma_regex's cases. # def text_match_pragma() -> bool: - if (pragma_regex.match('#pragma once') and - pragma_regex.match(' #pragma once') and - pragma_regex.match('# pragma once') and - pragma_regex.match('#pragma once') and - pragma_regex.match('#pragma once // comment')): - if (not pragma_regex.match('//#pragma once') and - not pragma_regex.match('/*#pragma once*/')): - print('#pragma once match valid') - return True - return False + if (pragma_regex.match('#pragma once') and + pragma_regex.match(' #pragma once') and + pragma_regex.match('# pragma once') and + pragma_regex.match('#pragma once') and + pragma_regex.match('#pragma once // comment')): + if (not pragma_regex.match('//#pragma once') and + not pragma_regex.match('/*#pragma once*/')): + print('#pragma once match valid') + return True + return False # Finds 'file'. First the currently processing file's 'parent' path is looked at # for a match, followed by the list of 'root' paths, returning a valid Path in # canonical form. If no match is found None is returned. # def resolve_include(file: str, parent: Optional[Path] = None) -> Optional[Path]: - if (parent): - found = parent.joinpath(file).resolve(); - else: - found = Path(file) - if (found.is_file()): - return found - for root in roots: - found = root.joinpath(file).resolve() - if (found.is_file()): - return found - return None + if (parent): + found = parent.joinpath(file).resolve(); + else: + found = Path(file) + if (found.is_file()): + return found + for root in roots: + found = root.joinpath(file).resolve() + if (found.is_file()): + return found + return None # Helper to resolve lists of files. 'file_list' is passed in from the arguments # and each entry resolved to its canonical path (like any include entry, either # from the list of root paths or the owning file's 'parent', which in this case # is case is the input file). The results are stored in 'resolved'. # -def resolve_files(file_list: Optional[List[str]], resolved: Set[Path], parent: Optional[Path] = None) -> None: - if (file_list): - for filename in file_list: - found = resolve_include(filename, parent) - if (found): - resolved.add(found) - else: - error_line(f'Warning: excluded file not found: {filename}') +def resolve_excluded_files(file_list: Optional[List[str]], resolved: Set[Path], parent: Optional[Path] = None) -> None: + if (file_list): + for filename in file_list: + found = resolve_include(filename, parent) + if (found): + resolved.add(found) + else: + error_line(f'Warning: excluded file not found: {filename}') # Writes 'line' to the open 'destn' (or stdout). # def write_line(line: str) -> None: - print(line, file=destn) + print(line, file=destn) # Logs 'line' to stderr. This is also used for general notifications that we # don't want to go to stdout (so the source can be piped). # def error_line(line: Any) -> None: - print(line, file=sys.stderr) + print(line, file=sys.stderr) # Inline the contents of 'file' (with any of its includes also inlined, etc.). # -def add_file(file: Path) -> None: - if (file.is_file()): - error_line(f'Processing: {file}') - with file.open('r') as opened: - for line in opened: - line = line.rstrip('\n') - match_include = include_regex.match(line); - if (match_include): - # We have a quoted include directive so grab the file - inc_name = match_include.group(1) - resolved = resolve_include(inc_name, file.parent) - if (resolved): - if (resolved in excludes): - # The file was excluded so error if the source attempts to use it - write_line(f'#error Using excluded file: {inc_name}') - error_line(f'Excluding: {inc_name}') - else: - if (resolved not in found): - # The file was not previously encountered - found.add(resolved) - if (resolved in keeps): - # But the include was flagged to keep as included - write_line(f'/**** *NOT* inlining {inc_name} ****/') - write_line(line) - error_line('Not Inlining: {inc_name}') - else: - # The file was neither excluded nor seen before so inline it - write_line(f'/**** start inlining {inc_name} ****/') - add_file(resolved) - write_line(f'/**** ended inlining {inc_name} ****/') - else: - write_line(f'/**** skipping file: {inc_name} ****/') - else: - # The include file didn't resolve to a file - write_line(f'#error Unable to find: {inc_name}') - error_line(f'Error: Unable to find: {inc_name}') - else: - # Skip any 'pragma once' directives, otherwise write the source line - if (keep_pragma or not pragma_regex.match(line)): - write_line(line) - else: - error_line(f'Error: Invalid file: {file}') +def add_file(file: Path, file_name: str = None) -> None: + if (file.is_file()): + if (not file_name): + file_name = file.name + error_line(f'Processing: {file_name}') + with file.open('r') as opened: + for line in opened: + line = line.rstrip('\n') + match_include = include_regex.match(line); + if (match_include): + # We have a quoted include directive so grab the file + inc_name = match_include.group(1) + resolved = resolve_include(inc_name, file.parent) + if (resolved): + if (resolved in excludes): + # The file was excluded so error if the compiler uses it + write_line(f'#error Using excluded file: {inc_name}') + error_line(f'Excluding: {inc_name}') + else: + if (resolved not in found): + # The file was not previously encountered + found.add(resolved) + if (resolved in keeps): + # But the include was flagged to keep as included + write_line(f'/**** *NOT* inlining {inc_name} ****/') + write_line(line) + error_line(f'Not inlining: {inc_name}') + else: + # The file was neither excluded nor seen before so inline it + write_line(f'/**** start inlining {inc_name} ****/') + add_file(resolved, inc_name) + write_line(f'/**** ended inlining {inc_name} ****/') + else: + write_line(f'/**** skipping file: {inc_name} ****/') + else: + # The include file didn't resolve to a file + write_line(f'#error Unable to find: {inc_name}') + error_line(f'Error: Unable to find: {inc_name}') + else: + # Skip any 'pragma once' directives, otherwise write the source line + if (keep_pragma or not pragma_regex.match(line)): + write_line(line) + else: + error_line(f'Error: Invalid file: {file}') # Start here parser = argparse.ArgumentParser(description='Amalgamate Tool', epilog=f'example: {sys.argv[0]} -r ../my/path -r ../other/path -o out.c in.c') @@ -197,19 +211,19 @@ found.add(args.input) # Resolve all of the root paths upfront (we'll halt here on invalid roots) if (args.root): - for path in args.root: - roots.add(path.resolve(strict=True)) + for path in args.root: + roots.add(path.resolve(strict=True)) # The remaining params: so resolve the excluded files and #pragma once directive -resolve_files(args.exclude, excludes, args.input.parent) -resolve_files(args.keep, keeps, args.input.parent) +resolve_excluded_files(args.exclude, excludes, args.input.parent) +resolve_excluded_files(args.keep, keeps, args.input.parent) keep_pragma = args.pragma; # Then recursively process the input file try: - if (args.output): - destn = args.output - add_file(args.input) + if (args.output): + destn = args.output + add_file(args.input) finally: - if (not destn): - destn.close() + if (not destn): + destn.close() diff --git a/build/single_file_libs/combine.sh b/build/single_file_libs/combine.sh index 8eac4f9eb..674a5a275 100755 --- a/build/single_file_libs/combine.sh +++ b/build/single_file_libs/combine.sh @@ -200,6 +200,7 @@ if [ -n "$1" ]; then printf "" > "$DESTN" fi test_deps + log_line "Processing using the slower shell script; this might take a while" add_file "$1" else echo "Input file not found: \"$1\"" diff --git a/build/single_file_libs/create_single_file_decoder.sh b/build/single_file_libs/create_single_file_decoder.sh index 1c8841d18..3c0c577df 100755 --- a/build/single_file_libs/create_single_file_decoder.sh +++ b/build/single_file_libs/create_single_file_decoder.sh @@ -4,12 +4,12 @@ ZSTD_SRC_ROOT="../../lib" # Amalgamate the sources -echo "Amalgamating files... this can take a while" +echo "Amalgamating files..." # Using the faster Python script if we have 3.8 or higher if python3 -c 'import sys; assert sys.version_info >= (3,8)' 2>/dev/null; then - ./combine.py -r "$ZSTD_SRC_ROOT" -o zstddeclib.c zstddeclib-in.c + ./combine.py -r "$ZSTD_SRC_ROOT" -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c else - ./combine.sh -r "$ZSTD_SRC_ROOT" -o zstddeclib.c zstddeclib-in.c + ./combine.sh -r "$ZSTD_SRC_ROOT" -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c fi # Did combining work? if [ $? -ne 0 ]; then diff --git a/build/single_file_libs/create_single_file_library.sh b/build/single_file_libs/create_single_file_library.sh index 9b2f22a9d..a6f71f0f0 100755 --- a/build/single_file_libs/create_single_file_library.sh +++ b/build/single_file_libs/create_single_file_library.sh @@ -4,12 +4,12 @@ ZSTD_SRC_ROOT="../../lib" # Amalgamate the sources -echo "Amalgamating files... this can take a while" +echo "Amalgamating files..." # Using the faster Python script if we have 3.8 or higher if python3 -c 'import sys; assert sys.version_info >= (3,8)' 2>/dev/null; then - ./combine.py -r "$ZSTD_SRC_ROOT" -o zstd.c zstd-in.c + ./combine.py -r "$ZSTD_SRC_ROOT" -x legacy/zstd_legacy.h -o zstd.c zstd-in.c else - ./combine.sh -r "$ZSTD_SRC_ROOT" -o zstd.c zstd-in.c + ./combine.sh -r "$ZSTD_SRC_ROOT" -x legacy/zstd_legacy.h -o zstd.c zstd-in.c fi # Did combining work? if [ $? -ne 0 ]; then diff --git a/build/single_file_libs/zstd-in.c b/build/single_file_libs/zstd-in.c index b69468139..c22e4cd97 100644 --- a/build/single_file_libs/zstd-in.c +++ b/build/single_file_libs/zstd-in.c @@ -4,7 +4,7 @@ * * Generate using: * \code - * combine.sh -r ../../lib -o zstd.c zstd-in.c + * combine.sh -r ../../lib -x legacy/zstd_legacy.h -o zstd.c zstd-in.c * \endcode */ /* diff --git a/build/single_file_libs/zstddeclib-in.c b/build/single_file_libs/zstddeclib-in.c index 72abe6134..42c510736 100644 --- a/build/single_file_libs/zstddeclib-in.c +++ b/build/single_file_libs/zstddeclib-in.c @@ -4,7 +4,7 @@ * * Generate using: * \code - * combine.sh -r ../../lib -o zstddeclib.c zstddeclib-in.c + * combine.sh -r ../../lib -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c * \endcode */ /* From dd7d29a19c7ac00f02f524c0f8822c691b7ed64c Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Wed, 19 Jan 2022 15:57:33 +0100 Subject: [PATCH 013/472] Updated README --- build/single_file_libs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/single_file_libs/README.md b/build/single_file_libs/README.md index 1705b769b..64c973a68 100644 --- a/build/single_file_libs/README.md +++ b/build/single_file_libs/README.md @@ -12,7 +12,7 @@ This is the most common use case. The decompression library is small, adding, fo Create `zstddeclib.c` from the Zstd source using: ``` cd zstd/build/single_file_libs -./combine.sh -r ../../lib -o zstddeclib.c zstddeclib-in.c +python3 combine.py -r ../../lib -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c ``` Then add the resulting file to your project (see the [example files](examples)). @@ -26,7 +26,7 @@ The same tool can amalgamate the entire Zstd library for ease of adding both com Create `zstd.c` from the Zstd source using: ``` cd zstd/build/single_file_libs -./combine.sh -r ../../lib -o zstd.c zstd-in.c +python3 combine.py -r ../../lib -x legacy/zstd_legacy.h -k zstd.h -o zstd.c zstd-in.c ``` It's possible to create a compressor-only library but since the decompressor is so small in comparison this doesn't bring much of a gain (but for the curious, simply remove the files in the _decompress_ section at the end of `zstd-in.c`). From 5fd6ddaf8b633ea5999cd593b0671cb2bbe8f8d5 Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Wed, 19 Jan 2022 16:56:03 +0100 Subject: [PATCH 014/472] Fixed bugs found in other projects When testing amalgamating other projects it was found: invalid Unicode errors were tripping Python's text IO, and the header search order appears differs from the shell version. --- build/single_file_libs/combine.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index 0538ccb69..3d1018d5b 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -106,21 +106,21 @@ def text_match_pragma() -> bool: return True return False -# Finds 'file'. First the currently processing file's 'parent' path is looked at -# for a match, followed by the list of 'root' paths, returning a valid Path in +# Finds 'file'. First the list of 'root' paths are searched, followed by the +# the currently processing file's 'parent' path, returning a valid Path in # canonical form. If no match is found None is returned. # def resolve_include(file: str, parent: Optional[Path] = None) -> Optional[Path]: + for root in roots: + found = root.joinpath(file).resolve() + if (found.is_file()): + return found if (parent): found = parent.joinpath(file).resolve(); else: found = Path(file) if (found.is_file()): return found - for root in roots: - found = root.joinpath(file).resolve() - if (found.is_file()): - return found return None # Helper to resolve lists of files. 'file_list' is passed in from the arguments @@ -150,12 +150,17 @@ def error_line(line: Any) -> None: # Inline the contents of 'file' (with any of its includes also inlined, etc.). # +# Note: text encoding errors are ignored and replaced with ? when reading the +# input files. This isn't ideal, but it's more than likely in the comments than +# code and a) the text editor has probably also failed to read the same content, +# and b) the compiler probably did too. +# def add_file(file: Path, file_name: str = None) -> None: if (file.is_file()): if (not file_name): file_name = file.name error_line(f'Processing: {file_name}') - with file.open('r') as opened: + with file.open('r', errors='replace') as opened: for line in opened: line = line.rstrip('\n') match_include = include_regex.match(line); From 566ebce347aef4f7ea48e4c87fa58934a5944bd8 Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Wed, 19 Jan 2022 17:33:20 +0100 Subject: [PATCH 015/472] Python style change Co-authored-by: Alexandre Bury --- build/single_file_libs/combine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index 3d1018d5b..125e7d427 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -36,7 +36,7 @@ keeps: Set[Path] = set() keep_pragma: bool = False # Destination file object (or stdout if no output file was supplied). -destn:TextIO = sys.stdout +destn: TextIO = sys.stdout # Set of file Path objects previously inlined (and to ignore if reencountering). found: Set[Path] = set() From 786263ea85c9325fc03eca3a8d78bfe1c7a19547 Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Wed, 19 Jan 2022 17:48:10 +0100 Subject: [PATCH 016/472] Suggestion from code review --- build/single_file_libs/combine.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index 125e7d427..55cf32c5e 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -41,6 +41,18 @@ destn: TextIO = sys.stdout # Set of file Path objects previously inlined (and to ignore if reencountering). found: Set[Path] = set() +# Compiled regex Patern to handle "#pragma once" in various formats: +# +# #pragma once +# #pragma once +# # pragma once +# #pragma once +# #pragma once // comment +# +# Ignoring commented versions, same as include_regex. +# +pragma_regex: Pattern = re.compile(r'^\s*#\s*pragma\s*once\s*') + # Compiled regex Patern to handle the following type of file includes: # # #include "file" @@ -80,18 +92,6 @@ def test_match_include() -> bool: return True return False -# Compiled regex Patern to handle "#pragma once" in various formats: -# -# #pragma once -# #pragma once -# # pragma once -# #pragma once -# #pragma once // comment -# -# Ignoring commented versions, same as include_regex. -# -pragma_regex: Pattern = re.compile(r'^\s*#\s*pragma\s*once\s*') - # Simple tests to prove pragma_regex's cases. # def text_match_pragma() -> bool: From dc983e7d68aa2a78ceace5a73f3f29ba86b1383b Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Wed, 19 Jan 2022 18:05:35 +0100 Subject: [PATCH 017/472] Typo (and missing commit) --- build/single_file_libs/combine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index 55cf32c5e..6443edad3 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -94,7 +94,7 @@ def test_match_include() -> bool: # Simple tests to prove pragma_regex's cases. # -def text_match_pragma() -> bool: +def test_match_pragma() -> bool: if (pragma_regex.match('#pragma once') and pragma_regex.match(' #pragma once') and pragma_regex.match('# pragma once') and @@ -230,5 +230,5 @@ try: destn = args.output add_file(args.input) finally: - if (not destn): + if (destn): destn.close() From e74ca7979e021960aabce58c8307d8b827ec97d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Mu=C5=82a?= Date: Wed, 19 Jan 2022 18:29:54 +0100 Subject: [PATCH 018/472] Simplify HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop Get rid of three divisions. The original expression was: opmin := min((oend0 - op0) / 10, (oend1 - op1) / 10, (oend2 - op2) / 10, (oend3 - op3) / 10) r15 := min(r15, opmin) The division by 10 can be moved outside the `min`: opmin := min(oend0 - op0, oend1 - op1, oend2 - op2, oend3 - op3) r15 := min(r15, opmin/10) --- lib/decompress/huf_decompress_amd64.S | 41 ++++++++++----------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/lib/decompress/huf_decompress_amd64.S b/lib/decompress/huf_decompress_amd64.S index 49589cb61..3f0e5c26c 100644 --- a/lib/decompress/huf_decompress_amd64.S +++ b/lib/decompress/huf_decompress_amd64.S @@ -427,41 +427,30 @@ HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop: /* r15 = (ip0 - ilimit) / 7 */ movq %rdx, %r15 - movabsq $-3689348814741910323, %rdx - movq 8(%rsp), %rax /* rax = oend0 */ - subq %op0, %rax /* rax = oend0 - op0 */ - mulq %rdx - shrq $3, %rdx /* rdx = rax / 10 */ + /* r15 = min(r15, min(oend0 - op0, oend1 - op1, oend2 - op2, oend3 - op3) / 10) */ + movq 8(%rsp), %rax /* rax = oend0 */ + subq %op0, %rax /* rax = oend0 - op0 */ + movq 16(%rsp), %rdx /* rdx = oend1 */ + subq %op1, %rdx /* rdx = oend1 - op1 */ - /* r15 = min(%rdx, %r15) */ - cmpq %rdx, %r15 - cmova %rdx, %r15 + cmpq %rax, %rdx + cmova %rax, %rdx /* rdx = min(%rdx, %rax) */ - movabsq $-3689348814741910323, %rdx - movq 16(%rsp), %rax /* rax = oend1 */ - subq %op1, %rax /* rax = oend1 - op1 */ - mulq %rdx - shrq $3, %rdx /* rdx = rax / 10 */ - - /* r15 = min(%rdx, %r15) */ - cmpq %rdx, %r15 - cmova %rdx, %r15 - - movabsq $-3689348814741910323, %rdx movq 24(%rsp), %rax /* rax = oend2 */ subq %op2, %rax /* rax = oend2 - op2 */ - mulq %rdx - shrq $3, %rdx /* rdx = rax / 10 */ - /* r15 = min(%rdx, %r15) */ - cmpq %rdx, %r15 - cmova %rdx, %r15 + cmpq %rax, %rdx + cmova %rax, %rdx /* rdx = min(%rdx, %rax) */ - movabsq $-3689348814741910323, %rdx movq 32(%rsp), %rax /* rax = oend3 */ subq %op3, %rax /* rax = oend3 - op3 */ + + cmpq %rax, %rdx + cmova %rax, %rdx /* rdx = min(%rdx, %rax) */ + + movabsq $-3689348814741910323, %rax mulq %rdx - shrq $3, %rdx /* rdx = rax / 10 */ + shrq $3, %rdx /* rdx = rdx / 10 */ /* r15 = min(%rdx, %r15) */ cmpq %rdx, %r15 From 3f181b61927b0f517b11ddec2ca43490b6de693f Mon Sep 17 00:00:00 2001 From: Carl Woffenden Date: Thu, 20 Jan 2022 14:50:31 +0100 Subject: [PATCH 019/472] More descriptive exclusion error; updated docs and copyright --- build/single_file_libs/combine.py | 2 +- build/single_file_libs/combine.sh | 2 +- build/single_file_libs/zstd-in.c | 8 ++++++-- build/single_file_libs/zstddeclib-in.c | 8 ++++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index 6443edad3..badd68a91 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -171,7 +171,7 @@ def add_file(file: Path, file_name: str = None) -> None: if (resolved): if (resolved in excludes): # The file was excluded so error if the compiler uses it - write_line(f'#error Using excluded file: {inc_name}') + write_line(f'#error Using excluded file: {inc_name} (re-amalgamate source to fix)') error_line(f'Excluding: {inc_name}') else: if (resolved not in found): diff --git a/build/single_file_libs/combine.sh b/build/single_file_libs/combine.sh index 674a5a275..a4933bf21 100755 --- a/build/single_file_libs/combine.sh +++ b/build/single_file_libs/combine.sh @@ -130,7 +130,7 @@ add_file() { local res_inc="$(resolve_include "$srcdir" "$inc")" if list_has_item "$XINCS" "$inc"; then # The file was excluded so error if the source attempts to use it - write_line "#error Using excluded file: $inc" + write_line "#error Using excluded file: $inc (re-amalgamate source to fix)" log_line "Excluding: $inc" else if ! list_has_item "$FOUND" "$res_inc"; then diff --git a/build/single_file_libs/zstd-in.c b/build/single_file_libs/zstd-in.c index c22e4cd97..eecd9a688 100644 --- a/build/single_file_libs/zstd-in.c +++ b/build/single_file_libs/zstd-in.c @@ -4,11 +4,11 @@ * * Generate using: * \code - * combine.sh -r ../../lib -x legacy/zstd_legacy.h -o zstd.c zstd-in.c + * python combine.py -r ../../lib -x legacy/zstd_legacy.h -o zstd.c zstd-in.c * \endcode */ /* - * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc. + * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -28,6 +28,10 @@ * Note: the undefs for xxHash allow Zstd's implementation to coincide with with * standalone xxHash usage (with global defines). * + * Note: if you enable ZSTD_LEGACY_SUPPORT the combine.py script will need + * re-running without the "-x legacy/zstd_legacy.h" option (it excludes the + * legacy support at the source level). + * * Note: multithreading is enabled for all platforms apart from Emscripten. */ #define DEBUGLEVEL 0 diff --git a/build/single_file_libs/zstddeclib-in.c b/build/single_file_libs/zstddeclib-in.c index 42c510736..d0343c54a 100644 --- a/build/single_file_libs/zstddeclib-in.c +++ b/build/single_file_libs/zstddeclib-in.c @@ -4,11 +4,11 @@ * * Generate using: * \code - * combine.sh -r ../../lib -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c + * python combine.py -r ../../lib -x legacy/zstd_legacy.h -o zstddeclib.c zstddeclib-in.c * \endcode */ /* - * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc. + * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -27,6 +27,10 @@ * * Note: the undefs for xxHash allow Zstd's implementation to coincide with with * standalone xxHash usage (with global defines). + * + * Note: if you enable ZSTD_LEGACY_SUPPORT the combine.py script will need + * re-running without the "-x legacy/zstd_legacy.h" option (it excludes the + * legacy support at the source level). */ #define DEBUGLEVEL 0 #define MEM_MODULE From 7cf80cb94c23867f7496f6a847f7d4e712dafb86 Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Wed, 12 Jan 2022 14:02:27 -0500 Subject: [PATCH 020/472] Add GitHub Action Checking that Zstd Runs Successfully Under CET --- .github/workflows/dev-short-tests.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index f06dfdb61..dfff4cbed 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -390,6 +390,27 @@ jobs: DIR .\fuzzer.exe -T2m + intel-cet-compatibility: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build Zstd + run: | + make -j zstd V=1 + readelf -n zstd + - name: Get Intel SDE + run: | + curl -LO https://downloadmirror.intel.com/684899/sde-external-9.0.0-2021-11-07-lin.tar.xz + tar xJvf sde-external-9.0.0-2021-11-07-lin.tar.xz + - name: Configure Permissions + run: | + echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope + - name: Run Under SDE + run: | + sde-external-9.0.0-2021-11-07-lin/sde -cet -cet-raise 0 -cet-endbr-exe -cet-stderr -cet-abort -- ./zstd -b3 + + + # This test currently fails on Github Actions specifically. # Possible reason : TTY emulation. # Note that the same test works fine locally and on travisCI. From d6fcdd123cbf05735c894c81599a0926c3427d4f Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 11 Jan 2022 10:36:44 -0800 Subject: [PATCH 021/472] x86: Append -z cet-report=error to LDFLAGS Append -z cet-report=error to LDFLAGS if -fcf-protection is enabled by default in compiler to catch the missing Intel CET marker: compiling multi-threaded dynamic library 1.5.1 /usr/local/bin/ld: obj/conf_f408b4c825de923ffc88f7f21b6884b1/dynamic/huf_decompress_amd64.o: error: missing IBT and SHSTK properties collect2: error: ld returned 1 exit status ... LINK obj/conf_dbc0b41e36c44111bb0bb918e093d7c1/zstd /usr/local/bin/ld: obj/conf_dbc0b41e36c44111bb0bb918e093d7c1/huf_decompress_amd64.o: error: missing IBT and SHSTK properties collect2: error: ld returned 1 exit status --- lib/libzstd.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/libzstd.mk b/lib/libzstd.mk index 6e9a64395..df298d789 100644 --- a/lib/libzstd.mk +++ b/lib/libzstd.mk @@ -114,6 +114,10 @@ CFLAGS += -Qunused-arguments -Wa,--noexecstack endif endif +ifeq ($(shell echo "int main(int argc, char* argv[]) { (void)argc; (void)argv; return 0; }" | $(CC) $(FLAGS) -z cet-report=error -x c -Werror - -o $(VOID) 2>$(VOID) && echo 1 || echo 0),1) +LDFLAGS += -z cet-report=error +endif + HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) GREP_OPTIONS ?= ifeq ($HAVE_COLORNEVER, 1) From f936dd89cb6fcf5dd2b03db0ca93dc76181838a9 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 20 Jan 2022 11:46:09 -0700 Subject: [PATCH 022/472] Minor lint fix --- lib/compress/zstdmt_compress.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/compress/zstdmt_compress.c b/lib/compress/zstdmt_compress.c index 6bc14b035..b0b337e42 100644 --- a/lib/compress/zstdmt_compress.c +++ b/lib/compress/zstdmt_compress.c @@ -266,11 +266,11 @@ static void ZSTDMT_releaseBuffer(ZSTDMT_bufferPool* bufPool, buffer_t buf) * 1 buffer for input loading * 1 buffer for "next input" when submitting current one * 1 buffer stuck in queue */ -#define BUF_POOL_MAX_NB_BUFFERS(nbWorkers) 2*nbWorkers + 3 +#define BUF_POOL_MAX_NB_BUFFERS(nbWorkers) (2*(nbWorkers) + 3) /* After a worker releases its rawSeqStore, it is immediately ready for reuse. * So we only need one seq buffer per worker. */ -#define SEQ_POOL_MAX_NB_BUFFERS(nbWorkers) nbWorkers +#define SEQ_POOL_MAX_NB_BUFFERS(nbWorkers) (nbWorkers) /* ===== Seq Pool Wrapper ====== */ From fa9cb4510ac26cdad607e19c72133e4c4961b189 Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Thu, 20 Jan 2022 17:36:28 -0500 Subject: [PATCH 023/472] Trigger Release Artifact Generation on Publish We previously triggered release artifact generation on release creation. We sometimes observed that the action failed to run. I hypothesized that we were hitting rate limiting or something. I just stumbled across [this documentat- ion](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release), which says: > Note: Workflows are not triggered for the `created`, `edited`, or `deleted` > activity types for draft releases. When you create your release through the > GitHub browser UI, your release may automatically be saved as a draft. This must have been what was happening. This commit therefore changes the trigger to the `published` activity. This should be more reliable. This does have the unfortunate side effect that artifacts won't be generated or attached until *after* the release has been published, which is what I was trying to avoid by using the `created` activity. Oh well. --- .github/workflows/publish-release-artifacts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-release-artifacts.yml b/.github/workflows/publish-release-artifacts.yml index 952cb26b7..a87a75efa 100644 --- a/.github/workflows/publish-release-artifacts.yml +++ b/.github/workflows/publish-release-artifacts.yml @@ -3,7 +3,7 @@ name: publish-release-artifacts on: release: types: - - created + - published jobs: publish-release-artifacts: From 1598e6c634ac041c1928c1be00dfa3484d282397 Mon Sep 17 00:00:00 2001 From: Yonatan Komornik <11005061+yoniko@users.noreply.github.com> Date: Fri, 21 Jan 2022 13:55:41 -0800 Subject: [PATCH 024/472] Async write for decompression (#2975) * Async IO decompression: - Added --[no-]asyncio flag for CLI decompression. - Replaced dstBuffer in decompression with a pool of write jobs. - Added an ability to execute write jobs in a separate thread. - Added an ability to wait (join) on all jobs in a thread pool (queued and running). --- build/meson/programs/meson.build | 31 ++- lib/common/pool.c | 20 +- lib/common/pool.h | 6 + programs/fileio.c | 390 ++++++++++++++++++++++++------- programs/fileio.h | 1 + programs/zstdcli.c | 11 +- tests/playTests.sh | 38 +++ 7 files changed, 394 insertions(+), 103 deletions(-) diff --git a/build/meson/programs/meson.build b/build/meson/programs/meson.build index 4181030c2..0ae93fc10 100644 --- a/build/meson/programs/meson.build +++ b/build/meson/programs/meson.build @@ -20,14 +20,24 @@ zstd_programs_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), join_paths(zstd_rootdir, 'programs/dibio.c'), join_paths(zstd_rootdir, 'programs/zstdcli_trace.c'), # needed due to use of private symbol + -fvisibility=hidden - join_paths(zstd_rootdir, 'lib/common/xxhash.c')] - -zstd_c_args = libzstd_debug_cflags -if use_multi_thread - zstd_c_args += [ '-DZSTD_MULTITHREAD' ] -endif + join_paths(zstd_rootdir, 'lib/common/xxhash.c'), + join_paths(zstd_rootdir, 'lib/common/pool.c'), + join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), + join_paths(zstd_rootdir, 'lib/common/error_private.c')] zstd_deps = [ libzstd_dep ] +zstd_c_args = libzstd_debug_cflags + +zstd_frugal_deps = [ libzstd_dep ] +zstd_frugal_c_args = [ '-DZSTD_NOBENCH', '-DZSTD_NODICT', '-DZSTD_NOTRACE' ] + +if use_multi_thread + zstd_deps += [ thread_dep ] + zstd_c_args += [ '-DZSTD_MULTITHREAD' ] + zstd_frugal_deps += [ thread_dep ] + zstd_frugal_c_args += [ '-DZSTD_MULTITHREAD' ] +endif + if use_zlib zstd_deps += [ zlib_dep ] zstd_c_args += [ '-DZSTD_GZCOMPRESS', '-DZSTD_GZDECOMPRESS' ] @@ -69,14 +79,17 @@ zstd = executable('zstd', zstd_frugal_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), join_paths(zstd_rootdir, 'programs/timefn.c'), join_paths(zstd_rootdir, 'programs/util.c'), - join_paths(zstd_rootdir, 'programs/fileio.c')] + join_paths(zstd_rootdir, 'programs/fileio.c'), + join_paths(zstd_rootdir, 'lib/common/pool.c'), + join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), + join_paths(zstd_rootdir, 'lib/common/error_private.c')] # Minimal target, with only zstd compression and decompression. # No bench. No legacy. executable('zstd-frugal', zstd_frugal_sources, - dependencies: libzstd_dep, - c_args: [ '-DZSTD_NOBENCH', '-DZSTD_NODICT', '-DZSTD_NOTRACE' ], + dependencies: zstd_frugal_deps, + c_args: zstd_frugal_c_args, install: true) install_data(join_paths(zstd_rootdir, 'programs/zstdgrep'), diff --git a/lib/common/pool.c b/lib/common/pool.c index 2e37cdd73..5c1d07d35 100644 --- a/lib/common/pool.c +++ b/lib/common/pool.c @@ -96,9 +96,7 @@ static void* POOL_thread(void* opaque) { /* If the intended queue size was 0, signal after finishing job */ ZSTD_pthread_mutex_lock(&ctx->queueMutex); ctx->numThreadsBusy--; - if (ctx->queueSize == 1) { - ZSTD_pthread_cond_signal(&ctx->queuePushCond); - } + ZSTD_pthread_cond_signal(&ctx->queuePushCond); ZSTD_pthread_mutex_unlock(&ctx->queueMutex); } } /* for (;;) */ @@ -190,6 +188,17 @@ void POOL_free(POOL_ctx *ctx) { ZSTD_customFree(ctx, ctx->customMem); } +/*! POOL_joinJobs() : + * Waits for all queued jobs to finish executing. + */ +void POOL_joinJobs(POOL_ctx* ctx) { + ZSTD_pthread_mutex_lock(&ctx->queueMutex); + while(!ctx->queueEmpty || ctx->numThreadsBusy > 0) { + ZSTD_pthread_cond_wait(&ctx->queuePushCond, &ctx->queueMutex); + } + ZSTD_pthread_mutex_unlock(&ctx->queueMutex); +} + void ZSTD_freeThreadPool (ZSTD_threadPool* pool) { POOL_free (pool); } @@ -330,6 +339,11 @@ void POOL_free(POOL_ctx* ctx) { (void)ctx; } +void POOL_joinJobs(POOL_ctx* ctx){ + assert(!ctx || ctx == &g_poolCtx); + (void)ctx; +} + int POOL_resize(POOL_ctx* ctx, size_t numThreads) { (void)ctx; (void)numThreads; return 0; diff --git a/lib/common/pool.h b/lib/common/pool.h index 0ebde1805..b86a3452e 100644 --- a/lib/common/pool.h +++ b/lib/common/pool.h @@ -38,6 +38,12 @@ POOL_ctx* POOL_create_advanced(size_t numThreads, size_t queueSize, */ void POOL_free(POOL_ctx* ctx); + +/*! POOL_joinJobs() : + * Waits for all queued jobs to finish executing. + */ +void POOL_joinJobs(POOL_ctx* ctx); + /*! POOL_resize() : * Expands or shrinks pool's number of threads. * This is more efficient than releasing + creating a new context, diff --git a/programs/fileio.c b/programs/fileio.c index 5338fa629..b85e0806b 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -34,6 +34,8 @@ #include /* INT_MAX */ #include #include "timefn.h" /* UTIL_getTime, UTIL_clockSpanMicro */ +#include "../lib/common/pool.h" +#include "../lib/common/threading.h" #if defined (_MSC_VER) # include @@ -325,6 +327,7 @@ struct FIO_prefs_s { /* IO preferences */ U32 removeSrcFile; U32 overwrite; + U32 asyncIO; /* Computation resources preferences */ unsigned memLimit; @@ -395,6 +398,7 @@ FIO_prefs_t* FIO_createPreferences(void) ret->literalCompressionMode = ZSTD_ps_auto; ret->excludeCompressedFiles = 0; ret->allowBlockDevices = 0; + ret->asyncIO = 0; return ret; } @@ -558,6 +562,10 @@ void FIO_setContentSize(FIO_prefs_t* const prefs, int value) prefs->contentSize = value != 0; } +void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, unsigned value) { + prefs->asyncIO = value; +} + /* FIO_ctx_t functions */ void FIO_setHasStdoutOutput(FIO_ctx_t* const fCtx, int value) { @@ -1798,7 +1806,7 @@ FIO_compressFilename_srcFile(FIO_ctx_t* const fCtx, static const char* checked_index(const char* options[], size_t length, size_t index) { assert(index < length); - // Necessary to avoid warnings since -O3 will omit the above `assert` + /* Necessary to avoid warnings since -O3 will omit the above `assert` */ (void) length; return options[index]; } @@ -2000,16 +2008,124 @@ int FIO_compressMultipleFilenames(FIO_ctx_t* const fCtx, /* ************************************************************************** * Decompression ***************************************************************************/ +#define DECOMPRESSION_MAX_WRITE_JOBS (10) + +typedef struct { + /* These struct fields should be set only on creation and not changed afterwards */ + POOL_ctx* writerPool; + int totalWriteJobs; + FIO_prefs_t* prefs; + + /* Controls the file we currently write to, make changes only by using provided utility functions */ + FILE* dstFile; + unsigned storedSkips; + + /* The jobs and availableWriteJobs fields are access by both the main and writer threads and should + * only be mutated after locking the mutex */ + ZSTD_pthread_mutex_t writeJobsMutex; + void* jobs[DECOMPRESSION_MAX_WRITE_JOBS]; + int availableWriteJobs; +} write_pool_ctx_t; + +typedef struct { + /* These fields are automaically set and shouldn't be changed by non WritePool code. */ + write_pool_ctx_t *ctx; + FILE* dstFile; + void *buffer; + size_t bufferSize; + + /* This field should be changed before a job is queued for execution and should contain the number + * of bytes to write from the buffer. */ + size_t usedBufferSize; +} write_job_t; + typedef struct { void* srcBuffer; size_t srcBufferSize; size_t srcBufferLoaded; - void* dstBuffer; - size_t dstBufferSize; ZSTD_DStream* dctx; - FILE* dstFile; + write_pool_ctx_t *writePoolCtx; } dRess_t; +static write_job_t *FIO_createWriteJob(write_pool_ctx_t *ctx) { + void *buffer; + write_job_t *job; + job = (write_job_t*) malloc(sizeof(write_job_t)); + buffer = malloc(ZSTD_DStreamOutSize()); + if(!job || !buffer) + EXM_THROW(101, "Allocation error : not enough memory"); + job->buffer = buffer; + job->bufferSize = ZSTD_DStreamOutSize(); + job->usedBufferSize = 0; + job->dstFile = NULL; + job->ctx = ctx; + return job; +} + +/* WritePool_createThreadPool: + * Creates a thread pool and a mutex for threaded write pool. + * Displays warning if asyncio is requested but MT isn't available. */ +static void WritePool_createThreadPool(write_pool_ctx_t *ctx, const FIO_prefs_t *prefs) { + ctx->writerPool = NULL; + if(prefs->asyncIO) { +#ifdef ZSTD_MULTITHREAD + if (ZSTD_pthread_mutex_init(&ctx->writeJobsMutex, NULL)) + EXM_THROW(102, "Failed creating write jobs mutex"); + /* We want DECOMPRESSION_MAX_WRITE_JOBS-2 queue items because we need to always have 1 free buffer to + * decompress into and 1 buffer that's actively written to disk and owned by the writing thread. */ + assert(DECOMPRESSION_MAX_WRITE_JOBS >= 2); + ctx->writerPool = POOL_create(1, DECOMPRESSION_MAX_WRITE_JOBS - 2); + if (!ctx->writerPool) + EXM_THROW(103, "Failed creating writer thread pool"); +#else + DISPLAYLEVEL(2, "Note : asyncio decompression is disabled (lack of multithreading support) \n"); +#endif + } +} + +/* WritePool_create: + * Allocates and sets and a new write pool including its included jobs. */ +static write_pool_ctx_t* WritePool_create(FIO_prefs_t* const prefs) { + write_pool_ctx_t *ctx; + int i; + ctx = (write_pool_ctx_t*) malloc(sizeof(write_pool_ctx_t)); + if(!ctx) + EXM_THROW(100, "Allocation error : not enough memory"); + WritePool_createThreadPool(ctx, prefs); + ctx->prefs = prefs; + ctx->totalWriteJobs = ctx->writerPool ? DECOMPRESSION_MAX_WRITE_JOBS : 1; + ctx->availableWriteJobs = ctx->totalWriteJobs; + for(i=0; i < ctx->availableWriteJobs; i++) { + ctx->jobs[i] = FIO_createWriteJob(ctx); + } + ctx->storedSkips = 0; + ctx->dstFile = NULL; + return ctx; +} + +/* WritePool_free: + * Release a previously allocated write thread pool. Makes sure all takss are done and released. */ +static void WritePool_free(write_pool_ctx_t* ctx) { + int i=0; + if(ctx->writerPool) { + /* Make sure we finish all tasks and then free the resources */ + POOL_joinJobs(ctx->writerPool); + /* Make sure we are not leaking jobs */ + assert(ctx->availableWriteJobs==ctx->totalWriteJobs); + POOL_free(ctx->writerPool); + ZSTD_pthread_mutex_destroy(&ctx->writeJobsMutex); + } + assert(ctx->dstFile==NULL); + assert(ctx->storedSkips==0); + for(i=0; iavailableWriteJobs; i++) { + write_job_t* job = (write_job_t*) ctx->jobs[i]; + free(job->buffer); + free(job); + } + free(ctx); +} + + static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFileName) { dRess_t ress; @@ -2027,9 +2143,7 @@ static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFi ress.srcBufferSize = ZSTD_DStreamInSize(); ress.srcBuffer = malloc(ress.srcBufferSize); - ress.dstBufferSize = ZSTD_DStreamOutSize(); - ress.dstBuffer = malloc(ress.dstBufferSize); - if (!ress.srcBuffer || !ress.dstBuffer) + if (!ress.srcBuffer) EXM_THROW(61, "Allocation error : not enough memory"); /* dictionary */ @@ -2039,6 +2153,8 @@ static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFi free(dictBuffer); } + ress.writePoolCtx = WritePool_create(prefs); + return ress; } @@ -2046,9 +2162,16 @@ static void FIO_freeDResources(dRess_t ress) { CHECK( ZSTD_freeDStream(ress.dctx) ); free(ress.srcBuffer); - free(ress.dstBuffer); + WritePool_free(ress.writePoolCtx); } +/* FIO_consumeDSrcBuffer: + * Consumes len bytes from srcBuffer's start and moves the remaining data and srcBufferLoaded accordingly. */ +static void FIO_consumeDSrcBuffer(dRess_t *ress, size_t len) { + assert(ress->srcBufferLoaded >= len); + ress->srcBufferLoaded -= len; + memmove(ress->srcBuffer, (char *)ress->srcBuffer + len, ress->srcBufferLoaded); +} /** FIO_fwriteSparse() : * @return : storedSkips, @@ -2148,6 +2271,106 @@ FIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned storedS } } } +/* WritePool_releaseWriteJob: + * Releases an acquired job back to the pool. Doesn't execute the job. */ +static void WritePool_releaseWriteJob(write_job_t *job) { + write_pool_ctx_t *ctx = job->ctx; + if(ctx->writerPool) { + ZSTD_pthread_mutex_lock(&ctx->writeJobsMutex); + assert(ctx->availableWriteJobs < DECOMPRESSION_MAX_WRITE_JOBS); + ctx->jobs[ctx->availableWriteJobs++] = job; + ZSTD_pthread_mutex_unlock(&ctx->writeJobsMutex); + } else { + ctx->availableWriteJobs++; + } +} + +/* WritePool_acquireWriteJob: + * Returns an available write job to be used for a future write. */ +static write_job_t* WritePool_acquireWriteJob(write_pool_ctx_t *ctx) { + write_job_t *job; + assert(ctx->dstFile!=NULL || ctx->prefs->testMode); + if(ctx->writerPool) { + ZSTD_pthread_mutex_lock(&ctx->writeJobsMutex); + assert(ctx->availableWriteJobs > 0); + job = (write_job_t*) ctx->jobs[--ctx->availableWriteJobs]; + ZSTD_pthread_mutex_unlock(&ctx->writeJobsMutex); + } else { + assert(ctx->availableWriteJobs==1); + ctx->availableWriteJobs--; + job = (write_job_t*)ctx->jobs[0]; + } + job->usedBufferSize = 0; + job->dstFile = ctx->dstFile; + return job; +} + +/* WritePool_executeWriteJob: + * Executes a write job synchronously. Can be used as a function for a thread pool. */ +static void WritePool_executeWriteJob(void* opaque){ + write_job_t* job = (write_job_t*) opaque; + write_pool_ctx_t* ctx = job->ctx; + ctx->storedSkips = FIO_fwriteSparse(job->dstFile, job->buffer, job->usedBufferSize, ctx->prefs, ctx->storedSkips); + WritePool_releaseWriteJob(job); +} + +/* WritePool_queueWriteJob: + * Queues a write job for execution. + * Make sure to set `usedBufferSize` to the wanted length before call. + * The queued job shouldn't be used directly after queueing it. */ +static void WritePool_queueWriteJob(write_job_t *job) { + write_pool_ctx_t* ctx = job->ctx; + if(ctx->writerPool) + POOL_add(ctx->writerPool, WritePool_executeWriteJob, job); + else + WritePool_executeWriteJob(job); +} + +/* WritePool_queueAndReacquireWriteJob: + * Queues a write job for execution and acquires a new one. + * After execution `job`'s pointed value would change to the newly acquired job. + * Make sure to set `usedBufferSize` to the wanted length before call. + * The queued job shouldn't be used directly after queueing it. */ +static void WritePool_queueAndReacquireWriteJob(write_job_t **job) { + WritePool_queueWriteJob(*job); + *job = WritePool_acquireWriteJob((*job)->ctx); +} + +/* WritePool_sparseWriteEnd: + * Ends sparse writes to the current dstFile. + * Blocks on completion of all current write jobs before executing. */ +static void WritePool_sparseWriteEnd(write_pool_ctx_t* ctx) { + assert(ctx != NULL); + if(ctx->writerPool) + POOL_joinJobs(ctx->writerPool); + FIO_fwriteSparseEnd(ctx->prefs, ctx->dstFile, ctx->storedSkips); + ctx->storedSkips = 0; +} + +/* WritePool_setDstFile: + * Sets the destination file for future files in the pool. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. + * Also requires ending of sparse write if a previous file was used in sparse mode. */ +static void WritePool_setDstFile(write_pool_ctx_t *ctx, FILE* dstFile) { + assert(ctx!=NULL); + /* We can change the dst file only if we have finished writing */ + if(ctx->writerPool) + POOL_joinJobs(ctx->writerPool); + assert(ctx->storedSkips == 0); + assert(ctx->availableWriteJobs == ctx->totalWriteJobs); + ctx->dstFile = dstFile; +} + +/* WritePool_closeDstFile: + * Ends sparse write and closes the writePool's current dstFile and sets the dstFile to NULL. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. */ +static int WritePool_closeDstFile(write_pool_ctx_t *ctx) { + FILE *dstFile = ctx->dstFile; + assert(dstFile!=NULL || ctx->prefs->testMode!=0); + WritePool_sparseWriteEnd(ctx); + WritePool_setDstFile(ctx, NULL); + return fclose(dstFile); +} /** FIO_passThrough() : just copy input into output, for compatibility with gzip -df mode @return : 0 (no error) */ @@ -2224,7 +2447,7 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, U64 alreadyDecoded) /* for multi-frames streams */ { U64 frameSize = 0; - U32 storedSkips = 0; + write_job_t *writeJob = WritePool_acquireWriteJob(ress->writePoolCtx); /* display last 20 characters only */ { size_t const srcFileLength = strlen(srcFileName); @@ -2244,7 +2467,7 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, /* Main decompression Loop */ while (1) { ZSTD_inBuffer inBuff = { ress->srcBuffer, ress->srcBufferLoaded, 0 }; - ZSTD_outBuffer outBuff= { ress->dstBuffer, ress->dstBufferSize, 0 }; + ZSTD_outBuffer outBuff= { writeJob->buffer, writeJob->bufferSize, 0 }; size_t const readSizeHint = ZSTD_decompressStream(ress->dctx, &outBuff, &inBuff); const int displayLevel = (g_display_prefs.progressSetting == FIO_ps_always) ? 1 : 2; UTIL_HumanReadableSize_t const hrs = UTIL_makeHumanReadableSize(alreadyDecoded+frameSize); @@ -2256,7 +2479,8 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, } /* Write block */ - storedSkips = FIO_fwriteSparse(ress->dstFile, ress->dstBuffer, outBuff.pos, prefs, storedSkips); + writeJob->usedBufferSize = outBuff.pos; + WritePool_queueAndReacquireWriteJob(&writeJob); frameSize += outBuff.pos; if (fCtx->nbFilesTotal > 1) { size_t srcFileNameSize = strlen(srcFileName); @@ -2273,10 +2497,7 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, srcFileName, hrs.precision, hrs.value, hrs.suffix); } - if (inBuff.pos > 0) { - memmove(ress->srcBuffer, (char*)ress->srcBuffer + inBuff.pos, inBuff.size - inBuff.pos); - ress->srcBufferLoaded -= inBuff.pos; - } + FIO_consumeDSrcBuffer(ress, inBuff.pos); if (readSizeHint == 0) break; /* end of frame */ @@ -2294,7 +2515,8 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, ress->srcBufferLoaded += readSize; } } } - FIO_fwriteSparseEnd(prefs, ress->dstFile, storedSkips); + WritePool_releaseWriteJob(writeJob); + WritePool_sparseWriteEnd(ress->writePoolCtx); return frameSize; } @@ -2302,15 +2524,13 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, #ifdef ZSTD_GZDECOMPRESS static unsigned long long -FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, - const FIO_prefs_t* const prefs, - const char* srcFileName) +FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, const char* srcFileName) { unsigned long long outFileSize = 0; z_stream strm; int flush = Z_NO_FLUSH; int decodingError = 0; - unsigned storedSkips = 0; + write_job_t *writeJob = NULL; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; @@ -2321,8 +2541,9 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, if (inflateInit2(&strm, 15 /* maxWindowLogSize */ + 16 /* gzip only */) != Z_OK) return FIO_ERROR_FRAME_DECODING; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; + writeJob = WritePool_acquireWriteJob(ress->writePoolCtx); + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; strm.avail_in = (uInt)ress->srcBufferLoaded; strm.next_in = (z_const unsigned char*)ress->srcBuffer; @@ -2343,35 +2564,34 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, DISPLAYLEVEL(1, "zstd: %s: inflate error %d \n", srcFileName, ret); decodingError = 1; break; } - { size_t const decompBytes = ress->dstBufferSize - strm.avail_out; + { size_t const decompBytes = writeJob->bufferSize - strm.avail_out; if (decompBytes) { - storedSkips = FIO_fwriteSparse(ress->dstFile, ress->dstBuffer, decompBytes, prefs, storedSkips); + writeJob->usedBufferSize = decompBytes; + WritePool_queueAndReacquireWriteJob(&writeJob); outFileSize += decompBytes; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; } } if (ret == Z_STREAM_END) break; } - if (strm.avail_in > 0) - memmove(ress->srcBuffer, strm.next_in, strm.avail_in); - ress->srcBufferLoaded = strm.avail_in; + FIO_consumeDSrcBuffer(ress, ress->srcBufferLoaded - strm.avail_in); + if ( (inflateEnd(&strm) != Z_OK) /* release resources ; error detected */ && (decodingError==0) ) { DISPLAYLEVEL(1, "zstd: %s: inflateEnd error \n", srcFileName); decodingError = 1; } - FIO_fwriteSparseEnd(prefs, ress->dstFile, storedSkips); + WritePool_releaseWriteJob(writeJob); + WritePool_sparseWriteEnd(ress->writePoolCtx); return decodingError ? FIO_ERROR_FRAME_DECODING : outFileSize; } #endif - #ifdef ZSTD_LZMADECOMPRESS static unsigned long long FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, - const FIO_prefs_t* const prefs, const char* srcFileName, int plain_lzma) { unsigned long long outFileSize = 0; @@ -2379,7 +2599,7 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, lzma_action action = LZMA_RUN; lzma_ret initRet; int decodingError = 0; - unsigned storedSkips = 0; + write_job_t *writeJob = NULL; strm.next_in = 0; strm.avail_in = 0; @@ -2396,8 +2616,9 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, return FIO_ERROR_FRAME_DECODING; } - strm.next_out = (BYTE*)ress->dstBuffer; - strm.avail_out = ress->dstBufferSize; + writeJob = WritePool_acquireWriteJob(ress->writePoolCtx); + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; strm.next_in = (BYTE const*)ress->srcBuffer; strm.avail_in = ress->srcBufferLoaded; @@ -2420,21 +2641,21 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, srcFileName, ret); decodingError = 1; break; } - { size_t const decompBytes = ress->dstBufferSize - strm.avail_out; + { size_t const decompBytes = writeJob->bufferSize - strm.avail_out; if (decompBytes) { - storedSkips = FIO_fwriteSparse(ress->dstFile, ress->dstBuffer, decompBytes, prefs, storedSkips); + writeJob->usedBufferSize = decompBytes; + WritePool_queueAndReacquireWriteJob(&writeJob); outFileSize += decompBytes; - strm.next_out = (BYTE*)ress->dstBuffer; - strm.avail_out = ress->dstBufferSize; + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = writeJob->bufferSize; } } if (ret == LZMA_STREAM_END) break; } - if (strm.avail_in > 0) - memmove(ress->srcBuffer, strm.next_in, strm.avail_in); - ress->srcBufferLoaded = strm.avail_in; + FIO_consumeDSrcBuffer(ress, ress->srcBufferLoaded - strm.avail_in); lzma_end(&strm); - FIO_fwriteSparseEnd(prefs, ress->dstFile, storedSkips); + WritePool_releaseWriteJob(writeJob); + WritePool_sparseWriteEnd(ress->writePoolCtx); return decodingError ? FIO_ERROR_FRAME_DECODING : outFileSize; } #endif @@ -2442,60 +2663,57 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, #ifdef ZSTD_LZ4DECOMPRESS static unsigned long long FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, - const FIO_prefs_t* const prefs, const char* srcFileName) { unsigned long long filesize = 0; - LZ4F_errorCode_t nextToLoad; + LZ4F_errorCode_t nextToLoad = 4; LZ4F_decompressionContext_t dCtx; LZ4F_errorCode_t const errorCode = LZ4F_createDecompressionContext(&dCtx, LZ4F_VERSION); int decodingError = 0; - unsigned storedSkips = 0; + write_job_t *writeJob = WritePool_acquireWriteJob(ress->writePoolCtx); if (LZ4F_isError(errorCode)) { DISPLAYLEVEL(1, "zstd: failed to create lz4 decompression context \n"); return FIO_ERROR_FRAME_DECODING; } - /* Init feed with magic number (already consumed from FILE* sFile) */ - { size_t inSize = 4; - size_t outSize= 0; - MEM_writeLE32(ress->srcBuffer, LZ4_MAGICNUMBER); - nextToLoad = LZ4F_decompress(dCtx, ress->dstBuffer, &outSize, ress->srcBuffer, &inSize, NULL); - if (LZ4F_isError(nextToLoad)) { - DISPLAYLEVEL(1, "zstd: %s: lz4 header error : %s \n", - srcFileName, LZ4F_getErrorName(nextToLoad)); - LZ4F_freeDecompressionContext(dCtx); - return FIO_ERROR_FRAME_DECODING; - } } - /* Main Loop */ for (;nextToLoad;) { size_t readSize; size_t pos = 0; - size_t decodedBytes = ress->dstBufferSize; + size_t decodedBytes = writeJob->bufferSize; + int fullBufferDecoded = 0; /* Read input */ - if (nextToLoad > ress->srcBufferSize) nextToLoad = ress->srcBufferSize; - readSize = fread(ress->srcBuffer, 1, nextToLoad, srcFile); - if (!readSize) break; /* reached end of file or stream */ + nextToLoad = MIN(nextToLoad, ress->srcBufferSize-ress->srcBufferLoaded); + readSize = fread((char *)ress->srcBuffer + ress->srcBufferLoaded, 1, nextToLoad, srcFile); + if(!readSize && ferror(srcFile)) { + DISPLAYLEVEL(1, "zstd: %s: read error \n", srcFileName); + decodingError=1; + break; + } + if(!readSize && !ress->srcBufferLoaded) break; /* reached end of file */ + ress->srcBufferLoaded += readSize; - while ((pos < readSize) || (decodedBytes == ress->dstBufferSize)) { /* still to read, or still to flush */ + while ((pos < ress->srcBufferLoaded) || fullBufferDecoded) { /* still to read, or still to flush */ /* Decode Input (at least partially) */ - size_t remaining = readSize - pos; - decodedBytes = ress->dstBufferSize; - nextToLoad = LZ4F_decompress(dCtx, ress->dstBuffer, &decodedBytes, (char*)(ress->srcBuffer)+pos, &remaining, NULL); + size_t remaining = ress->srcBufferLoaded - pos; + decodedBytes = writeJob->bufferSize; + nextToLoad = LZ4F_decompress(dCtx, writeJob->buffer, &decodedBytes, (char*)(ress->srcBuffer)+pos, &remaining, NULL); if (LZ4F_isError(nextToLoad)) { DISPLAYLEVEL(1, "zstd: %s: lz4 decompression error : %s \n", srcFileName, LZ4F_getErrorName(nextToLoad)); decodingError = 1; nextToLoad = 0; break; } pos += remaining; + assert(pos <= ress->srcBufferLoaded); + fullBufferDecoded = decodedBytes == writeJob->bufferSize; /* Write Block */ if (decodedBytes) { UTIL_HumanReadableSize_t hrs; - storedSkips = FIO_fwriteSparse(ress->dstFile, ress->dstBuffer, decodedBytes, prefs, storedSkips); + writeJob->usedBufferSize = decodedBytes; + WritePool_queueAndReacquireWriteJob(&writeJob); filesize += decodedBytes; hrs = UTIL_makeHumanReadableSize(filesize); DISPLAYUPDATE(2, "\rDecompressed : %.*f%s ", hrs.precision, hrs.value, hrs.suffix); @@ -2503,21 +2721,16 @@ FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, if (!nextToLoad) break; } + FIO_consumeDSrcBuffer(ress, pos); } - /* can be out because readSize == 0, which could be an fread() error */ - if (ferror(srcFile)) { - DISPLAYLEVEL(1, "zstd: %s: read error \n", srcFileName); - decodingError=1; - } - if (nextToLoad!=0) { DISPLAYLEVEL(1, "zstd: %s: unfinished lz4 stream \n", srcFileName); decodingError=1; } LZ4F_freeDecompressionContext(dCtx); - ress->srcBufferLoaded = 0; /* LZ4F will reach exact frame boundary */ - FIO_fwriteSparseEnd(prefs, ress->dstFile, storedSkips); + WritePool_releaseWriteJob(writeJob); + WritePool_sparseWriteEnd(ress->writePoolCtx); return decodingError ? FIO_ERROR_FRAME_DECODING : filesize; } @@ -2566,7 +2779,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, filesize += frameSize; } else if (buf[0] == 31 && buf[1] == 139) { /* gz magic number */ #ifdef ZSTD_GZDECOMPRESS - unsigned long long const frameSize = FIO_decompressGzFrame(&ress, srcFile, prefs, srcFileName); + unsigned long long const frameSize = FIO_decompressGzFrame(&ress, srcFile, srcFileName); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; #else @@ -2576,7 +2789,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, } else if ((buf[0] == 0xFD && buf[1] == 0x37) /* xz magic number */ || (buf[0] == 0x5D && buf[1] == 0x00)) { /* lzma header (no magic number) */ #ifdef ZSTD_LZMADECOMPRESS - unsigned long long const frameSize = FIO_decompressLzmaFrame(&ress, srcFile, prefs, srcFileName, buf[0] != 0xFD); + unsigned long long const frameSize = FIO_decompressLzmaFrame(&ress, srcFile, srcFileName, buf[0] != 0xFD); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; #else @@ -2585,7 +2798,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, #endif } else if (MEM_readLE32(buf) == LZ4_MAGICNUMBER) { #ifdef ZSTD_LZ4DECOMPRESS - unsigned long long const frameSize = FIO_decompressLz4Frame(&ress, srcFile, prefs, srcFileName); + unsigned long long const frameSize = FIO_decompressLz4Frame(&ress, srcFile, srcFileName); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; #else @@ -2594,7 +2807,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, #endif } else if ((prefs->overwrite) && !strcmp (dstFileName, stdoutmark)) { /* pass-through mode */ return FIO_passThrough(prefs, - ress.dstFile, srcFile, + ress.writePoolCtx->dstFile, srcFile, ress.srcBuffer, ress.srcBufferSize, ress.srcBufferLoaded); } else { @@ -2632,7 +2845,8 @@ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, int releaseDstFile = 0; int transferMTime = 0; - if ((ress.dstFile == NULL) && (prefs->testMode==0)) { + if ((ress.writePoolCtx->dstFile == NULL) && (prefs->testMode==0)) { + FILE *dstFile; int dstFilePermissions = DEFAULT_FILE_PERMISSIONS; if ( strcmp(srcFileName, stdinmark) /* special case : don't transfer permissions from stdin */ && strcmp(dstFileName, stdoutmark) @@ -2644,8 +2858,9 @@ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, releaseDstFile = 1; - ress.dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName, dstFilePermissions); - if (ress.dstFile==NULL) return 1; + dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName, dstFilePermissions); + if (dstFile==NULL) return 1; + WritePool_setDstFile(ress.writePoolCtx, dstFile); /* Must only be added after FIO_openDstFile() succeeds. * Otherwise we may delete the destination file if it already exists, @@ -2657,10 +2872,8 @@ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, result = FIO_decompressFrames(fCtx, ress, srcFile, prefs, dstFileName, srcFileName); if (releaseDstFile) { - FILE* const dstFile = ress.dstFile; clearHandler(); - ress.dstFile = NULL; - if (fclose(dstFile)) { + if (WritePool_closeDstFile(ress.writePoolCtx)) { DISPLAYLEVEL(1, "zstd: %s: %s \n", dstFileName, strerror(errno)); result = 1; } @@ -2874,15 +3087,16 @@ FIO_decompressMultipleFilenames(FIO_ctx_t* const fCtx, return 1; } if (!prefs->testMode) { - ress.dstFile = FIO_openDstFile(fCtx, prefs, NULL, outFileName, DEFAULT_FILE_PERMISSIONS); - if (ress.dstFile == 0) EXM_THROW(19, "cannot open %s", outFileName); + FILE* dstFile = FIO_openDstFile(fCtx, prefs, NULL, outFileName, DEFAULT_FILE_PERMISSIONS); + if (dstFile == 0) EXM_THROW(19, "cannot open %s", outFileName); + WritePool_setDstFile(ress.writePoolCtx, dstFile); } for (; fCtx->currFileIdx < fCtx->nbFilesTotal; fCtx->currFileIdx++) { status = FIO_decompressSrcFile(fCtx, prefs, ress, outFileName, srcNamesTable[fCtx->currFileIdx]); if (!status) fCtx->nbFilesProcessed++; error |= status; } - if ((!prefs->testMode) && (fclose(ress.dstFile))) + if ((!prefs->testMode) && (WritePool_closeDstFile(ress.writePoolCtx))) EXM_THROW(72, "Write error : %s : cannot properly close output file", strerror(errno)); } else { diff --git a/programs/fileio.h b/programs/fileio.h index 61094db83..398937a64 100644 --- a/programs/fileio.h +++ b/programs/fileio.h @@ -109,6 +109,7 @@ void FIO_setAllowBlockDevices(FIO_prefs_t* const prefs, int allowBlockDevices); void FIO_setPatchFromMode(FIO_prefs_t* const prefs, int value); void FIO_setContentSize(FIO_prefs_t* const prefs, int value); void FIO_displayCompressionParameters(const FIO_prefs_t* prefs); +void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, unsigned value); /* FIO_ctx_t functions */ void FIO_setNbFilesTotal(FIO_ctx_t* const fCtx, int value); diff --git a/programs/zstdcli.c b/programs/zstdcli.c index bfe18c0c1..fd563e1c2 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -239,9 +239,12 @@ static void usage_advanced(const char* programName) #ifndef ZSTD_NODECOMPRESS DISPLAYOUT( "\n"); DISPLAYOUT( "Advanced decompression arguments : \n"); - DISPLAYOUT( " -l : print information about zstd compressed files \n"); - DISPLAYOUT( "--test : test compressed file integrity \n"); - DISPLAYOUT( " -M# : Set a memory usage limit for decompression \n"); + DISPLAYOUT( " -l : print information about zstd compressed files \n"); + DISPLAYOUT( "--test : test compressed file integrity \n"); + DISPLAYOUT( " -M# : Set a memory usage limit for decompression \n"); +#ifdef ZSTD_MULTITHREAD + DISPLAYOUT( "--[no-]asyncio : use threaded asynchronous IO for output (default: disabled) \n"); +#endif # if ZSTD_SPARSE_DEFAULT DISPLAYOUT( "--[no-]sparse : sparse mode (default: enabled on file, disabled on stdout) \n"); # else @@ -912,6 +915,8 @@ int main(int argCount, const char* argv[]) if (!strcmp(argument, "--sparse")) { FIO_setSparseWrite(prefs, 2); continue; } if (!strcmp(argument, "--no-sparse")) { FIO_setSparseWrite(prefs, 0); continue; } if (!strcmp(argument, "--test")) { operation=zom_test; continue; } + if (!strcmp(argument, "--asyncio")) { FIO_setAsyncIOFlag(prefs, 1); continue;} + if (!strcmp(argument, "--no-asyncio")) { FIO_setAsyncIOFlag(prefs, 0); continue;} if (!strcmp(argument, "--train")) { operation=zom_train; if (outFileName==NULL) outFileName=g_defaultDictName; continue; } if (!strcmp(argument, "--no-dictID")) { FIO_setDictIDFlag(prefs, 0); continue; } if (!strcmp(argument, "--keep")) { FIO_setRemoveSrcFile(prefs, 0); continue; } diff --git a/tests/playTests.sh b/tests/playTests.sh index b7a3d88a8..78d8e742a 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -1575,6 +1575,44 @@ elif [ "$longCSize19wlog23" -gt "$optCSize19wlog23" ]; then exit 1 fi +println "\n===> zstd asyncio decompression tests " + +addFrame() { + datagen -g2M -s$2 >> tmp_uncompressed + datagen -g2M -s$2 | zstd --format=$1 >> tmp_compressed.zst +} + +addTwoFrames() { + addFrame $1 1 + addFrame $1 2 +} + +testAsyncIO() { + roundTripTest -g2M "3 --asyncio --format=$1" + roundTripTest -g2M "3 --no-asyncio --format=$1" +} + +rm -f tmp_compressed tmp_uncompressed +testAsyncIO zstd +addTwoFrames zstd +if [ $GZIPMODE -eq 1 ]; then + testAsyncIO gzip + addTwoFrames gzip +fi +if [ $LZMAMODE -eq 1 ]; then + testAsyncIO lzma + addTwoFrames lzma +fi +if [ $LZ4MODE -eq 1 ]; then + testAsyncIO lz4 + addTwoFrames lz4 +fi +cat tmp_uncompressed | $MD5SUM > tmp2 +zstd -d tmp_compressed.zst --asyncio -c | $MD5SUM > tmp1 +$DIFF -q tmp1 tmp2 +rm tmp1 +zstd -d tmp_compressed.zst --no-asyncio -c | $MD5SUM > tmp1 +$DIFF -q tmp1 tmp2 if [ "$1" != "--test-large-data" ]; then println "Skipping large data tests" From 24318093cce0ae0fc55922a55761bf5389d7384d Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 21 Jan 2022 14:08:46 -0800 Subject: [PATCH 025/472] slightly shortened compression status update line to fit within 80 columns limit. --- programs/fileio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/fileio.c b/programs/fileio.c index f5e2e488c..3f6df112d 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -1449,7 +1449,7 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, /* display progress notifications */ if (g_display_prefs.displayLevel >= 3) { - DISPLAYUPDATE(3, "\r(L%i) Buffered :%6.*f%4s - Consumed :%6.*f%4s - Compressed :%6.*f%4s => %.2f%% ", + DISPLAYUPDATE(3, "\r(L%i) Buffered:%5.*f%4s - Consumed:%5.*f%4s - Compressed:%5.*f%4s => %.2f%% ", compressionLevel, buffered_hrs.precision, buffered_hrs.value, buffered_hrs.suffix, consumed_hrs.precision, consumed_hrs.value, consumed_hrs.suffix, From 17017ac8db47e93cd656d15c6cf5c414b3355394 Mon Sep 17 00:00:00 2001 From: binhdvo Date: Fri, 21 Jan 2022 19:57:19 -0500 Subject: [PATCH 026/472] Change zstdless behavior to align with zless (#2909) * Change zstdless behavior to align with zless --- programs/zstdless | 8 +++++++- tests/playTests.sh | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/programs/zstdless b/programs/zstdless index 893799e7d..17726a4f6 100755 --- a/programs/zstdless +++ b/programs/zstdless @@ -1,2 +1,8 @@ #!/bin/sh -zstdcat "$@" | less + +zstd=${ZSTD:-zstd} + +# TODO: Address quirks and bugs tied to old versions of less, provide a mechanism to pass flags directly to zstd + +export LESSOPEN="|-${zstd} -cdfq %s" +exec less "$@" diff --git a/tests/playTests.sh b/tests/playTests.sh index 78d8e742a..f19291a60 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -89,6 +89,7 @@ PRGDIR="$SCRIPT_DIR/../programs" TESTDIR="$SCRIPT_DIR/../tests" UNAME=$(uname) ZSTDGREP="$PRGDIR/zstdgrep" +ZSTDLESS="$PRGDIR/zstdless" detectedTerminal=false if [ -t 0 ] && [ -t 1 ] @@ -322,6 +323,20 @@ ZCAT=./zstdcat "$ZSTDGREP" 2>&1 "1234" tmp_grep_bad.zst && die "Should have fail ZCAT=./zstdcat "$ZSTDGREP" 2>&1 "1234" tmp_grep_bad.zst | grep "No such file or directory" || true rm -f tmp_grep* +println "\n===> zstdless tests" +if [ -n "$(which less)" ]; then + ln -sf "$ZSTD_BIN" zstd + rm -f tmp_less* + echo "1234" > tmp_less + zstd -f tmp_less + lines=$(ZSTD=./zstd "$ZSTDLESS" 2>&1 tmp_less.zst | wc -l) + test 1 -eq $lines + ZSTD=./zstd "$ZSTDLESS" -f tmp_less.zst > tmp_less_regenerated + $DIFF tmp_less tmp_less_regenerated + ZSTD=./zstd "$ZSTDLESS" 2>&1 tmp_less_bad.zst | grep "No such file or directory" || die + rm -f tmp_less* +fi + println "\n===> --exclude-compressed flag" rm -rf precompressedFilterTestDir mkdir -p precompressedFilterTestDir From feaaf7a6b1d1301e99634951d6ab3e20625e9a4a Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 21 Jan 2022 21:38:35 -0800 Subject: [PATCH 027/472] slightly shortened status and summary lines in very verbose mode --- programs/fileio.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index 3f6df112d..d40ebbc1e 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -1449,7 +1449,7 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, /* display progress notifications */ if (g_display_prefs.displayLevel >= 3) { - DISPLAYUPDATE(3, "\r(L%i) Buffered:%5.*f%4s - Consumed:%5.*f%4s - Compressed:%5.*f%4s => %.2f%% ", + DISPLAYUPDATE(3, "\r(L%i) Buffered:%5.*f%s - Consumed:%5.*f%s - Compressed:%5.*f%s => %.2f%% ", compressionLevel, buffered_hrs.precision, buffered_hrs.value, buffered_hrs.suffix, consumed_hrs.precision, consumed_hrs.value, consumed_hrs.suffix, @@ -1646,13 +1646,13 @@ FIO_compressFilename_internal(FIO_ctx_t* const fCtx, UTIL_HumanReadableSize_t hr_isize = UTIL_makeHumanReadableSize((U64) readsize); UTIL_HumanReadableSize_t hr_osize = UTIL_makeHumanReadableSize((U64) compressedfilesize); if (readsize == 0) { - DISPLAYLEVEL(2,"%-20s : (%6.*f%4s => %6.*f%4s, %s) \n", + DISPLAYLEVEL(2,"%-20s : (%6.*f%s => %6.*f%s, %s) \n", srcFileName, hr_isize.precision, hr_isize.value, hr_isize.suffix, hr_osize.precision, hr_osize.value, hr_osize.suffix, dstFileName); } else { - DISPLAYLEVEL(2,"%-20s :%6.2f%% (%6.*f%4s => %6.*f%4s, %s) \n", + DISPLAYLEVEL(2,"%-20s :%6.2f%% (%6.*f%s => %6.*f%s, %s) \n", srcFileName, (double)compressedfilesize / (double)readsize * 100, hr_isize.precision, hr_isize.value, hr_isize.suffix, From 2b957afec7b43afa2884441856c0d7277bdecb49 Mon Sep 17 00:00:00 2001 From: Tom Rix Date: Mon, 24 Jan 2022 12:43:39 -0800 Subject: [PATCH 028/472] cleanup double word in comment. Remove the second 'a' and 'into' Signed-off-by: Tom Rix --- lib/zstd.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/zstd.h b/lib/zstd.h index a88ae7bf8..349d8017f 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -1395,7 +1395,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* o /*! ZSTD_mergeBlockDelimiters() : * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals - * by merging them into into the literals of the next sequence. + * by merging them into the literals of the next sequence. * * As such, the final generated result has no explicit representation of block boundaries, * and the final last literals segment is not represented in the sequences. @@ -1442,7 +1442,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* ds /*! ZSTD_writeSkippableFrame() : * Generates a zstd skippable frame containing data given by src, and writes it to dst buffer. * - * Skippable frames begin with a a 4-byte magic number. There are 16 possible choices of magic number, + * Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number, * ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15. * As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so * the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant. From 70df5de1b2fc291a58c1b3199dde11b353ccad8f Mon Sep 17 00:00:00 2001 From: Yonatan Komornik <11005061+yoniko@users.noreply.github.com> Date: Mon, 24 Jan 2022 14:43:02 -0800 Subject: [PATCH 029/472] AsyncIO compression part 1 - refactor of existing asyncio code (#3021) * Refactored fileio.c: - Extracted asyncio code to fileio_asyncio.c/.h - Moved type definitions to fileio_types.h - Moved common macro definitions needed by both fileio.c and fileio_asyncio.c to fileio_common.h * Bugfix - rename fileio_asycio to fileio_asyncio * Added copyrights & license to new files * CR fixes --- build/VS2008/zstd/zstd.vcproj | 4 + build/VS2010/zstd/zstd.vcxproj | 1 + build/cmake/programs/CMakeLists.txt | 4 +- build/meson/programs/meson.build | 2 + contrib/VS2005/zstd/zstd.vcproj | 4 + programs/Makefile | 8 +- programs/fileio.c | 528 +++------------------------- programs/fileio.h | 8 +- programs/fileio_asyncio.c | 365 +++++++++++++++++++ programs/fileio_asyncio.h | 120 +++++++ programs/fileio_common.h | 117 ++++++ programs/fileio_types.h | 73 ++++ 12 files changed, 736 insertions(+), 498 deletions(-) create mode 100644 programs/fileio_asyncio.c create mode 100644 programs/fileio_asyncio.h create mode 100644 programs/fileio_common.h create mode 100644 programs/fileio_types.h diff --git a/build/VS2008/zstd/zstd.vcproj b/build/VS2008/zstd/zstd.vcproj index c7eec577d..91f2bda53 100644 --- a/build/VS2008/zstd/zstd.vcproj +++ b/build/VS2008/zstd/zstd.vcproj @@ -384,6 +384,10 @@ RelativePath="..\..\..\programs\fileio.c" > + + diff --git a/build/VS2010/zstd/zstd.vcxproj b/build/VS2010/zstd/zstd.vcxproj index 46e22f42e..8ab239dd8 100644 --- a/build/VS2010/zstd/zstd.vcxproj +++ b/build/VS2010/zstd/zstd.vcxproj @@ -62,6 +62,7 @@ + diff --git a/build/cmake/programs/CMakeLists.txt b/build/cmake/programs/CMakeLists.txt index 490030783..28b1e1d16 100644 --- a/build/cmake/programs/CMakeLists.txt +++ b/build/cmake/programs/CMakeLists.txt @@ -32,7 +32,7 @@ if (MSVC) set(PlatformDependResources ${MSVC_RESOURCE_DIR}/zstd.rc) endif () -add_executable(zstd ${PROGRAMS_DIR}/zstdcli.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/fileio.c ${PROGRAMS_DIR}/benchfn.c ${PROGRAMS_DIR}/benchzstd.c ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/dibio.c ${PROGRAMS_DIR}/zstdcli_trace.c ${PlatformDependResources}) +add_executable(zstd ${PROGRAMS_DIR}/zstdcli.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/fileio.c ${PROGRAMS_DIR}/fileio_asyncio.c ${PROGRAMS_DIR}/benchfn.c ${PROGRAMS_DIR}/benchzstd.c ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/dibio.c ${PROGRAMS_DIR}/zstdcli_trace.c ${PlatformDependResources}) target_link_libraries(zstd ${PROGRAMS_ZSTD_LINK_TARGET}) if (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") target_link_libraries(zstd rt) @@ -75,7 +75,7 @@ if (UNIX) ${CMAKE_CURRENT_BINARY_DIR}/zstdless.1 DESTINATION "${MAN_INSTALL_DIR}") - add_executable(zstd-frugal ${PROGRAMS_DIR}/zstdcli.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/fileio.c) + add_executable(zstd-frugal ${PROGRAMS_DIR}/zstdcli.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/fileio.c ${PROGRAMS_DIR}/fileio_asyncio.c) target_link_libraries(zstd-frugal ${PROGRAMS_ZSTD_LINK_TARGET}) set_property(TARGET zstd-frugal APPEND PROPERTY COMPILE_DEFINITIONS "ZSTD_NOBENCH;ZSTD_NODICT;ZSTD_NOTRACE") endif () diff --git a/build/meson/programs/meson.build b/build/meson/programs/meson.build index 0ae93fc10..5ccd679a1 100644 --- a/build/meson/programs/meson.build +++ b/build/meson/programs/meson.build @@ -14,6 +14,7 @@ zstd_programs_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), join_paths(zstd_rootdir, 'programs/util.c'), join_paths(zstd_rootdir, 'programs/timefn.c'), join_paths(zstd_rootdir, 'programs/fileio.c'), + join_paths(zstd_rootdir, 'programs/fileio_asyncio.c'), join_paths(zstd_rootdir, 'programs/benchfn.c'), join_paths(zstd_rootdir, 'programs/benchzstd.c'), join_paths(zstd_rootdir, 'programs/datagen.c'), @@ -80,6 +81,7 @@ zstd_frugal_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), join_paths(zstd_rootdir, 'programs/timefn.c'), join_paths(zstd_rootdir, 'programs/util.c'), join_paths(zstd_rootdir, 'programs/fileio.c'), + join_paths(zstd_rootdir, 'programs/fileio_asyncio.c'), join_paths(zstd_rootdir, 'lib/common/pool.c'), join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), join_paths(zstd_rootdir, 'lib/common/error_private.c')] diff --git a/contrib/VS2005/zstd/zstd.vcproj b/contrib/VS2005/zstd/zstd.vcproj index 78645d18a..e37ebee39 100644 --- a/contrib/VS2005/zstd/zstd.vcproj +++ b/contrib/VS2005/zstd/zstd.vcproj @@ -363,6 +363,10 @@ RelativePath="..\..\..\programs\fileio.c" > + + diff --git a/programs/Makefile b/programs/Makefile index f77e1b7f1..16763e493 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -243,17 +243,17 @@ zstd-pgo : ## zstd-small: minimal target, supporting only zstd compression and decompression. no bench. no legacy. no other format. zstd-small: CFLAGS = -Os -s -zstd-frugal zstd-small: $(ZSTDLIB_CORE_SRC) zstdcli.c util.c timefn.c fileio.c +zstd-frugal zstd-small: $(ZSTDLIB_CORE_SRC) zstdcli.c util.c timefn.c fileio.c fileio_asyncio.c $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) -zstd-decompress: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_DECOMPRESS_SRC) zstdcli.c util.c timefn.c fileio.c +zstd-decompress: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_DECOMPRESS_SRC) zstdcli.c util.c timefn.c fileio.c fileio_asyncio.c $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOCOMPRESS -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) -zstd-compress: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_COMPRESS_SRC) zstdcli.c util.c timefn.c fileio.c +zstd-compress: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_COMPRESS_SRC) zstdcli.c util.c timefn.c fileio.c fileio_asyncio.c $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NODECOMPRESS -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) ## zstd-dictBuilder: executable supporting dictionary creation and compression (only) -zstd-dictBuilder: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_COMPRESS_SRC) $(ZDICT_SRC) zstdcli.c util.c timefn.c fileio.c dibio.c +zstd-dictBuilder: $(ZSTDLIB_COMMON_SRC) $(ZSTDLIB_COMPRESS_SRC) $(ZDICT_SRC) zstdcli.c util.c timefn.c fileio.c fileio_asyncio.c dibio.c $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODECOMPRESS -DZSTD_NOTRACE $^ -o $@$(EXT) zstdmt: zstd diff --git a/programs/fileio.c b/programs/fileio.c index d40ebbc1e..2066096d2 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -34,16 +34,18 @@ #include /* INT_MAX */ #include #include "timefn.h" /* UTIL_getTime, UTIL_clockSpanMicro */ -#include "../lib/common/pool.h" -#include "../lib/common/threading.h" #if defined (_MSC_VER) # include # include #endif -#include "../lib/common/mem.h" /* U32, U64 */ #include "fileio.h" +#include "fileio_asyncio.h" +#include "fileio_common.h" + +FIO_display_prefs_t g_display_prefs = {2, FIO_ps_auto}; +UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; #define ZSTD_STATIC_LINKING_ONLY /* ZSTD_magicNumber, ZSTD_frameHeaderSize_max */ #include "../lib/zstd.h" @@ -84,62 +86,6 @@ #define DEFAULT_FILE_PERMISSIONS (0666) #endif -/*-************************************* -* Macros -***************************************/ -#define KB *(1 <<10) -#define MB *(1 <<20) -#define GB *(1U<<30) -#undef MAX -#define MAX(a,b) ((a)>(b) ? (a) : (b)) - -struct FIO_display_prefs_s { - int displayLevel; /* 0 : no display; 1: errors; 2: + result + interaction + warnings; 3: + progression; 4: + information */ - FIO_progressSetting_e progressSetting; -}; - -static FIO_display_prefs_t g_display_prefs = {2, FIO_ps_auto}; - -#define DISPLAY(...) fprintf(stderr, __VA_ARGS__) -#define DISPLAYOUT(...) fprintf(stdout, __VA_ARGS__) -#define DISPLAYLEVEL(l, ...) { if (g_display_prefs.displayLevel>=l) { DISPLAY(__VA_ARGS__); } } - -static const U64 g_refreshRate = SEC_TO_MICRO / 6; -static UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; - -#define READY_FOR_UPDATE() ((g_display_prefs.progressSetting != FIO_ps_never) && UTIL_clockSpanMicro(g_displayClock) > g_refreshRate) -#define DELAY_NEXT_UPDATE() { g_displayClock = UTIL_getTime(); } -#define DISPLAYUPDATE(l, ...) { \ - if (g_display_prefs.displayLevel>=l && (g_display_prefs.progressSetting != FIO_ps_never)) { \ - if (READY_FOR_UPDATE() || (g_display_prefs.displayLevel>=4)) { \ - DELAY_NEXT_UPDATE(); \ - DISPLAY(__VA_ARGS__); \ - if (g_display_prefs.displayLevel>=4) fflush(stderr); \ - } } } - -#undef MIN /* in case it would be already defined */ -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - - -#define EXM_THROW(error, ...) \ -{ \ - DISPLAYLEVEL(1, "zstd: "); \ - DISPLAYLEVEL(5, "Error defined at %s, line %i : \n", __FILE__, __LINE__); \ - DISPLAYLEVEL(1, "error %i : ", error); \ - DISPLAYLEVEL(1, __VA_ARGS__); \ - DISPLAYLEVEL(1, " \n"); \ - exit(error); \ -} - -#define CHECK_V(v, f) \ - v = f; \ - if (ZSTD_isError(v)) { \ - DISPLAYLEVEL(5, "%s \n", #f); \ - EXM_THROW(11, "%s", ZSTD_getErrorName(v)); \ - } -#define CHECK(f) { size_t err; CHECK_V(err, f); } - - /*-************************************ * Signal (Ctrl-C trapping) **************************************/ @@ -250,95 +196,6 @@ void FIO_addAbortHandler() #endif } - -/*-************************************************************ -* Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW -***************************************************************/ -#if defined(_MSC_VER) && _MSC_VER >= 1400 -# define LONG_SEEK _fseeki64 -# define LONG_TELL _ftelli64 -#elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ -# define LONG_SEEK fseeko -# define LONG_TELL ftello -#elif defined(__MINGW32__) && !defined(__STRICT_ANSI__) && !defined(__NO_MINGW_LFS) && defined(__MSVCRT__) -# define LONG_SEEK fseeko64 -# define LONG_TELL ftello64 -#elif defined(_WIN32) && !defined(__DJGPP__) -# include - static int LONG_SEEK(FILE* file, __int64 offset, int origin) { - LARGE_INTEGER off; - DWORD method; - off.QuadPart = offset; - if (origin == SEEK_END) - method = FILE_END; - else if (origin == SEEK_CUR) - method = FILE_CURRENT; - else - method = FILE_BEGIN; - - if (SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, NULL, method)) - return 0; - else - return -1; - } - static __int64 LONG_TELL(FILE* file) { - LARGE_INTEGER off, newOff; - off.QuadPart = 0; - newOff.QuadPart = 0; - SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, &newOff, FILE_CURRENT); - return newOff.QuadPart; - } -#else -# define LONG_SEEK fseek -# define LONG_TELL ftell -#endif - - -/*-************************************* -* Parameters: FIO_prefs_t -***************************************/ - -/* typedef'd to FIO_prefs_t within fileio.h */ -struct FIO_prefs_s { - - /* Algorithm preferences */ - FIO_compressionType_t compressionType; - U32 sparseFileSupport; /* 0: no sparse allowed; 1: auto (file yes, stdout no); 2: force sparse */ - int dictIDFlag; - int checksumFlag; - int blockSize; - int overlapLog; - U32 adaptiveMode; - U32 useRowMatchFinder; - int rsyncable; - int minAdaptLevel; - int maxAdaptLevel; - int ldmFlag; - int ldmHashLog; - int ldmMinMatch; - int ldmBucketSizeLog; - int ldmHashRateLog; - size_t streamSrcSize; - size_t targetCBlockSize; - int srcSizeHint; - int testMode; - ZSTD_paramSwitch_e literalCompressionMode; - - /* IO preferences */ - U32 removeSrcFile; - U32 overwrite; - U32 asyncIO; - - /* Computation resources preferences */ - unsigned memLimit; - int nbWorkers; - - int excludeCompressedFiles; - int patchFromMode; - int contentSize; - int allowBlockDevices; -}; - /*-************************************* * Parameters: FIO_ctx_t ***************************************/ @@ -563,7 +420,13 @@ void FIO_setContentSize(FIO_prefs_t* const prefs, int value) } void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, unsigned value) { +#ifdef ZSTD_MULTITHREAD prefs->asyncIO = value; +#else + (void) prefs; + (void) value; + DISPLAYLEVEL(2, "Note : asyncio is disabled (lack of multithreading support) \n"); +#endif } /* FIO_ctx_t functions */ @@ -2019,124 +1882,15 @@ int FIO_compressMultipleFilenames(FIO_ctx_t* const fCtx, /* ************************************************************************** * Decompression ***************************************************************************/ -#define DECOMPRESSION_MAX_WRITE_JOBS (10) - -typedef struct { - /* These struct fields should be set only on creation and not changed afterwards */ - POOL_ctx* writerPool; - int totalWriteJobs; - FIO_prefs_t* prefs; - - /* Controls the file we currently write to, make changes only by using provided utility functions */ - FILE* dstFile; - unsigned storedSkips; - - /* The jobs and availableWriteJobs fields are access by both the main and writer threads and should - * only be mutated after locking the mutex */ - ZSTD_pthread_mutex_t writeJobsMutex; - void* jobs[DECOMPRESSION_MAX_WRITE_JOBS]; - int availableWriteJobs; -} write_pool_ctx_t; - -typedef struct { - /* These fields are automaically set and shouldn't be changed by non WritePool code. */ - write_pool_ctx_t *ctx; - FILE* dstFile; - void *buffer; - size_t bufferSize; - - /* This field should be changed before a job is queued for execution and should contain the number - * of bytes to write from the buffer. */ - size_t usedBufferSize; -} write_job_t; typedef struct { void* srcBuffer; size_t srcBufferSize; size_t srcBufferLoaded; ZSTD_DStream* dctx; - write_pool_ctx_t *writePoolCtx; + WritePoolCtx_t *writeCtx; } dRess_t; -static write_job_t *FIO_createWriteJob(write_pool_ctx_t *ctx) { - void *buffer; - write_job_t *job; - job = (write_job_t*) malloc(sizeof(write_job_t)); - buffer = malloc(ZSTD_DStreamOutSize()); - if(!job || !buffer) - EXM_THROW(101, "Allocation error : not enough memory"); - job->buffer = buffer; - job->bufferSize = ZSTD_DStreamOutSize(); - job->usedBufferSize = 0; - job->dstFile = NULL; - job->ctx = ctx; - return job; -} - -/* WritePool_createThreadPool: - * Creates a thread pool and a mutex for threaded write pool. - * Displays warning if asyncio is requested but MT isn't available. */ -static void WritePool_createThreadPool(write_pool_ctx_t *ctx, const FIO_prefs_t *prefs) { - ctx->writerPool = NULL; - if(prefs->asyncIO) { -#ifdef ZSTD_MULTITHREAD - if (ZSTD_pthread_mutex_init(&ctx->writeJobsMutex, NULL)) - EXM_THROW(102, "Failed creating write jobs mutex"); - /* We want DECOMPRESSION_MAX_WRITE_JOBS-2 queue items because we need to always have 1 free buffer to - * decompress into and 1 buffer that's actively written to disk and owned by the writing thread. */ - assert(DECOMPRESSION_MAX_WRITE_JOBS >= 2); - ctx->writerPool = POOL_create(1, DECOMPRESSION_MAX_WRITE_JOBS - 2); - if (!ctx->writerPool) - EXM_THROW(103, "Failed creating writer thread pool"); -#else - DISPLAYLEVEL(2, "Note : asyncio decompression is disabled (lack of multithreading support) \n"); -#endif - } -} - -/* WritePool_create: - * Allocates and sets and a new write pool including its included jobs. */ -static write_pool_ctx_t* WritePool_create(FIO_prefs_t* const prefs) { - write_pool_ctx_t *ctx; - int i; - ctx = (write_pool_ctx_t*) malloc(sizeof(write_pool_ctx_t)); - if(!ctx) - EXM_THROW(100, "Allocation error : not enough memory"); - WritePool_createThreadPool(ctx, prefs); - ctx->prefs = prefs; - ctx->totalWriteJobs = ctx->writerPool ? DECOMPRESSION_MAX_WRITE_JOBS : 1; - ctx->availableWriteJobs = ctx->totalWriteJobs; - for(i=0; i < ctx->availableWriteJobs; i++) { - ctx->jobs[i] = FIO_createWriteJob(ctx); - } - ctx->storedSkips = 0; - ctx->dstFile = NULL; - return ctx; -} - -/* WritePool_free: - * Release a previously allocated write thread pool. Makes sure all takss are done and released. */ -static void WritePool_free(write_pool_ctx_t* ctx) { - int i=0; - if(ctx->writerPool) { - /* Make sure we finish all tasks and then free the resources */ - POOL_joinJobs(ctx->writerPool); - /* Make sure we are not leaking jobs */ - assert(ctx->availableWriteJobs==ctx->totalWriteJobs); - POOL_free(ctx->writerPool); - ZSTD_pthread_mutex_destroy(&ctx->writeJobsMutex); - } - assert(ctx->dstFile==NULL); - assert(ctx->storedSkips==0); - for(i=0; iavailableWriteJobs; i++) { - write_job_t* job = (write_job_t*) ctx->jobs[i]; - free(job->buffer); - free(job); - } - free(ctx); -} - - static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFileName) { dRess_t ress; @@ -2164,7 +1918,7 @@ static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFi free(dictBuffer); } - ress.writePoolCtx = WritePool_create(prefs); + ress.writeCtx = AIO_WritePool_create(prefs, ZSTD_DStreamOutSize()); return ress; } @@ -2173,7 +1927,7 @@ static void FIO_freeDResources(dRess_t ress) { CHECK( ZSTD_freeDStream(ress.dctx) ); free(ress.srcBuffer); - WritePool_free(ress.writePoolCtx); + AIO_WritePool_free(ress.writeCtx); } /* FIO_consumeDSrcBuffer: @@ -2184,205 +1938,6 @@ static void FIO_consumeDSrcBuffer(dRess_t *ress, size_t len) { memmove(ress->srcBuffer, (char *)ress->srcBuffer + len, ress->srcBufferLoaded); } -/** FIO_fwriteSparse() : -* @return : storedSkips, -* argument for next call to FIO_fwriteSparse() or FIO_fwriteSparseEnd() */ -static unsigned -FIO_fwriteSparse(FILE* file, - const void* buffer, size_t bufferSize, - const FIO_prefs_t* const prefs, - unsigned storedSkips) -{ - const size_t* const bufferT = (const size_t*)buffer; /* Buffer is supposed malloc'ed, hence aligned on size_t */ - size_t bufferSizeT = bufferSize / sizeof(size_t); - const size_t* const bufferTEnd = bufferT + bufferSizeT; - const size_t* ptrT = bufferT; - static const size_t segmentSizeT = (32 KB) / sizeof(size_t); /* check every 32 KB */ - - if (prefs->testMode) return 0; /* do not output anything in test mode */ - - if (!prefs->sparseFileSupport) { /* normal write */ - size_t const sizeCheck = fwrite(buffer, 1, bufferSize, file); - if (sizeCheck != bufferSize) - EXM_THROW(70, "Write error : cannot write decoded block : %s", - strerror(errno)); - return 0; - } - - /* avoid int overflow */ - if (storedSkips > 1 GB) { - if (LONG_SEEK(file, 1 GB, SEEK_CUR) != 0) - EXM_THROW(91, "1 GB skip error (sparse file support)"); - storedSkips -= 1 GB; - } - - while (ptrT < bufferTEnd) { - size_t nb0T; - - /* adjust last segment if < 32 KB */ - size_t seg0SizeT = segmentSizeT; - if (seg0SizeT > bufferSizeT) seg0SizeT = bufferSizeT; - bufferSizeT -= seg0SizeT; - - /* count leading zeroes */ - for (nb0T=0; (nb0T < seg0SizeT) && (ptrT[nb0T] == 0); nb0T++) ; - storedSkips += (unsigned)(nb0T * sizeof(size_t)); - - if (nb0T != seg0SizeT) { /* not all 0s */ - size_t const nbNon0ST = seg0SizeT - nb0T; - /* skip leading zeros */ - if (LONG_SEEK(file, storedSkips, SEEK_CUR) != 0) - EXM_THROW(92, "Sparse skip error ; try --no-sparse"); - storedSkips = 0; - /* write the rest */ - if (fwrite(ptrT + nb0T, sizeof(size_t), nbNon0ST, file) != nbNon0ST) - EXM_THROW(93, "Write error : cannot write decoded block : %s", - strerror(errno)); - } - ptrT += seg0SizeT; - } - - { static size_t const maskT = sizeof(size_t)-1; - if (bufferSize & maskT) { - /* size not multiple of sizeof(size_t) : implies end of block */ - const char* const restStart = (const char*)bufferTEnd; - const char* restPtr = restStart; - const char* const restEnd = (const char*)buffer + bufferSize; - assert(restEnd > restStart && restEnd < restStart + sizeof(size_t)); - for ( ; (restPtr < restEnd) && (*restPtr == 0); restPtr++) ; - storedSkips += (unsigned) (restPtr - restStart); - if (restPtr != restEnd) { - /* not all remaining bytes are 0 */ - size_t const restSize = (size_t)(restEnd - restPtr); - if (LONG_SEEK(file, storedSkips, SEEK_CUR) != 0) - EXM_THROW(92, "Sparse skip error ; try --no-sparse"); - if (fwrite(restPtr, 1, restSize, file) != restSize) - EXM_THROW(95, "Write error : cannot write end of decoded block : %s", - strerror(errno)); - storedSkips = 0; - } } } - - return storedSkips; -} - -static void -FIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned storedSkips) -{ - if (prefs->testMode) assert(storedSkips == 0); - if (storedSkips>0) { - assert(prefs->sparseFileSupport > 0); /* storedSkips>0 implies sparse support is enabled */ - (void)prefs; /* assert can be disabled, in which case prefs becomes unused */ - if (LONG_SEEK(file, storedSkips-1, SEEK_CUR) != 0) - EXM_THROW(69, "Final skip error (sparse file support)"); - /* last zero must be explicitly written, - * so that skipped ones get implicitly translated as zero by FS */ - { const char lastZeroByte[1] = { 0 }; - if (fwrite(lastZeroByte, 1, 1, file) != 1) - EXM_THROW(69, "Write error : cannot write last zero : %s", strerror(errno)); - } } -} - -/* WritePool_releaseWriteJob: - * Releases an acquired job back to the pool. Doesn't execute the job. */ -static void WritePool_releaseWriteJob(write_job_t *job) { - write_pool_ctx_t *ctx = job->ctx; - if(ctx->writerPool) { - ZSTD_pthread_mutex_lock(&ctx->writeJobsMutex); - assert(ctx->availableWriteJobs < DECOMPRESSION_MAX_WRITE_JOBS); - ctx->jobs[ctx->availableWriteJobs++] = job; - ZSTD_pthread_mutex_unlock(&ctx->writeJobsMutex); - } else { - ctx->availableWriteJobs++; - } -} - -/* WritePool_acquireWriteJob: - * Returns an available write job to be used for a future write. */ -static write_job_t* WritePool_acquireWriteJob(write_pool_ctx_t *ctx) { - write_job_t *job; - assert(ctx->dstFile!=NULL || ctx->prefs->testMode); - if(ctx->writerPool) { - ZSTD_pthread_mutex_lock(&ctx->writeJobsMutex); - assert(ctx->availableWriteJobs > 0); - job = (write_job_t*) ctx->jobs[--ctx->availableWriteJobs]; - ZSTD_pthread_mutex_unlock(&ctx->writeJobsMutex); - } else { - assert(ctx->availableWriteJobs==1); - ctx->availableWriteJobs--; - job = (write_job_t*)ctx->jobs[0]; - } - job->usedBufferSize = 0; - job->dstFile = ctx->dstFile; - return job; -} - -/* WritePool_executeWriteJob: - * Executes a write job synchronously. Can be used as a function for a thread pool. */ -static void WritePool_executeWriteJob(void* opaque){ - write_job_t* job = (write_job_t*) opaque; - write_pool_ctx_t* ctx = job->ctx; - ctx->storedSkips = FIO_fwriteSparse(job->dstFile, job->buffer, job->usedBufferSize, ctx->prefs, ctx->storedSkips); - WritePool_releaseWriteJob(job); -} - -/* WritePool_queueWriteJob: - * Queues a write job for execution. - * Make sure to set `usedBufferSize` to the wanted length before call. - * The queued job shouldn't be used directly after queueing it. */ -static void WritePool_queueWriteJob(write_job_t *job) { - write_pool_ctx_t* ctx = job->ctx; - if(ctx->writerPool) - POOL_add(ctx->writerPool, WritePool_executeWriteJob, job); - else - WritePool_executeWriteJob(job); -} - -/* WritePool_queueAndReacquireWriteJob: - * Queues a write job for execution and acquires a new one. - * After execution `job`'s pointed value would change to the newly acquired job. - * Make sure to set `usedBufferSize` to the wanted length before call. - * The queued job shouldn't be used directly after queueing it. */ -static void WritePool_queueAndReacquireWriteJob(write_job_t **job) { - WritePool_queueWriteJob(*job); - *job = WritePool_acquireWriteJob((*job)->ctx); -} - -/* WritePool_sparseWriteEnd: - * Ends sparse writes to the current dstFile. - * Blocks on completion of all current write jobs before executing. */ -static void WritePool_sparseWriteEnd(write_pool_ctx_t* ctx) { - assert(ctx != NULL); - if(ctx->writerPool) - POOL_joinJobs(ctx->writerPool); - FIO_fwriteSparseEnd(ctx->prefs, ctx->dstFile, ctx->storedSkips); - ctx->storedSkips = 0; -} - -/* WritePool_setDstFile: - * Sets the destination file for future files in the pool. - * Requires completion of all queues write jobs and release of all otherwise acquired jobs. - * Also requires ending of sparse write if a previous file was used in sparse mode. */ -static void WritePool_setDstFile(write_pool_ctx_t *ctx, FILE* dstFile) { - assert(ctx!=NULL); - /* We can change the dst file only if we have finished writing */ - if(ctx->writerPool) - POOL_joinJobs(ctx->writerPool); - assert(ctx->storedSkips == 0); - assert(ctx->availableWriteJobs == ctx->totalWriteJobs); - ctx->dstFile = dstFile; -} - -/* WritePool_closeDstFile: - * Ends sparse write and closes the writePool's current dstFile and sets the dstFile to NULL. - * Requires completion of all queues write jobs and release of all otherwise acquired jobs. */ -static int WritePool_closeDstFile(write_pool_ctx_t *ctx) { - FILE *dstFile = ctx->dstFile; - assert(dstFile!=NULL || ctx->prefs->testMode!=0); - WritePool_sparseWriteEnd(ctx); - WritePool_setDstFile(ctx, NULL); - return fclose(dstFile); -} - /** FIO_passThrough() : just copy input into output, for compatibility with gzip -df mode @return : 0 (no error) */ static int FIO_passThrough(const FIO_prefs_t* const prefs, @@ -2403,7 +1958,7 @@ static int FIO_passThrough(const FIO_prefs_t* const prefs, do { readFromInput = fread(buffer, 1, blockSize, finput); - storedSkips = FIO_fwriteSparse(foutput, buffer, readFromInput, prefs, storedSkips); + storedSkips = AIO_fwriteSparse(foutput, buffer, readFromInput, prefs, storedSkips); } while (readFromInput == blockSize); if (ferror(finput)) { DISPLAYLEVEL(1, "Pass-through read error : %s\n", strerror(errno)); @@ -2411,7 +1966,7 @@ static int FIO_passThrough(const FIO_prefs_t* const prefs, } assert(feof(finput)); - FIO_fwriteSparseEnd(prefs, foutput, storedSkips); + AIO_fwriteSparseEnd(prefs, foutput, storedSkips); return 0; } @@ -2458,7 +2013,7 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, U64 alreadyDecoded) /* for multi-frames streams */ { U64 frameSize = 0; - write_job_t *writeJob = WritePool_acquireWriteJob(ress->writePoolCtx); + IOJob_t *writeJob = AIO_WritePool_acquireJob(ress->writeCtx); /* display last 20 characters only */ { size_t const srcFileLength = strlen(srcFileName); @@ -2486,12 +2041,13 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, DISPLAYLEVEL(1, "%s : Decoding error (36) : %s \n", srcFileName, ZSTD_getErrorName(readSizeHint)); FIO_zstdErrorHelp(prefs, ress, readSizeHint, srcFileName); + AIO_WritePool_releaseIoJob(writeJob); return FIO_ERROR_FRAME_DECODING; } /* Write block */ writeJob->usedBufferSize = outBuff.pos; - WritePool_queueAndReacquireWriteJob(&writeJob); + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); frameSize += outBuff.pos; if (fCtx->nbFilesTotal > 1) { size_t srcFileNameSize = strlen(srcFileName); @@ -2526,8 +2082,8 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, ress->srcBufferLoaded += readSize; } } } - WritePool_releaseWriteJob(writeJob); - WritePool_sparseWriteEnd(ress->writePoolCtx); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return frameSize; } @@ -2541,7 +2097,7 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, const char* srcFileName) z_stream strm; int flush = Z_NO_FLUSH; int decodingError = 0; - write_job_t *writeJob = NULL; + IOJob_t *writeJob = NULL; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; @@ -2552,7 +2108,7 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, const char* srcFileName) if (inflateInit2(&strm, 15 /* maxWindowLogSize */ + 16 /* gzip only */) != Z_OK) return FIO_ERROR_FRAME_DECODING; - writeJob = WritePool_acquireWriteJob(ress->writePoolCtx); + writeJob = AIO_WritePool_acquireJob(ress->writeCtx); strm.next_out = (Bytef*)writeJob->buffer; strm.avail_out = (uInt)writeJob->bufferSize; strm.avail_in = (uInt)ress->srcBufferLoaded; @@ -2578,7 +2134,7 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, const char* srcFileName) { size_t const decompBytes = writeJob->bufferSize - strm.avail_out; if (decompBytes) { writeJob->usedBufferSize = decompBytes; - WritePool_queueAndReacquireWriteJob(&writeJob); + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += decompBytes; strm.next_out = (Bytef*)writeJob->buffer; strm.avail_out = (uInt)writeJob->bufferSize; @@ -2594,8 +2150,8 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, const char* srcFileName) DISPLAYLEVEL(1, "zstd: %s: inflateEnd error \n", srcFileName); decodingError = 1; } - WritePool_releaseWriteJob(writeJob); - WritePool_sparseWriteEnd(ress->writePoolCtx); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return decodingError ? FIO_ERROR_FRAME_DECODING : outFileSize; } #endif @@ -2610,7 +2166,7 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, lzma_action action = LZMA_RUN; lzma_ret initRet; int decodingError = 0; - write_job_t *writeJob = NULL; + IOJob_t *writeJob = NULL; strm.next_in = 0; strm.avail_in = 0; @@ -2627,7 +2183,7 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, return FIO_ERROR_FRAME_DECODING; } - writeJob = WritePool_acquireWriteJob(ress->writePoolCtx); + writeJob = AIO_WritePool_acquireJob(ress->writeCtx); strm.next_out = (Bytef*)writeJob->buffer; strm.avail_out = (uInt)writeJob->bufferSize; strm.next_in = (BYTE const*)ress->srcBuffer; @@ -2655,7 +2211,7 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, { size_t const decompBytes = writeJob->bufferSize - strm.avail_out; if (decompBytes) { writeJob->usedBufferSize = decompBytes; - WritePool_queueAndReacquireWriteJob(&writeJob); + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += decompBytes; strm.next_out = (Bytef*)writeJob->buffer; strm.avail_out = writeJob->bufferSize; @@ -2665,8 +2221,8 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, FIO_consumeDSrcBuffer(ress, ress->srcBufferLoaded - strm.avail_in); lzma_end(&strm); - WritePool_releaseWriteJob(writeJob); - WritePool_sparseWriteEnd(ress->writePoolCtx); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return decodingError ? FIO_ERROR_FRAME_DECODING : outFileSize; } #endif @@ -2681,13 +2237,15 @@ FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, LZ4F_decompressionContext_t dCtx; LZ4F_errorCode_t const errorCode = LZ4F_createDecompressionContext(&dCtx, LZ4F_VERSION); int decodingError = 0; - write_job_t *writeJob = WritePool_acquireWriteJob(ress->writePoolCtx); + IOJob_t *writeJob = NULL; if (LZ4F_isError(errorCode)) { DISPLAYLEVEL(1, "zstd: failed to create lz4 decompression context \n"); return FIO_ERROR_FRAME_DECODING; } + writeJob = AIO_WritePool_acquireJob(ress->writeCtx); + /* Main Loop */ for (;nextToLoad;) { size_t readSize; @@ -2724,7 +2282,7 @@ FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, if (decodedBytes) { UTIL_HumanReadableSize_t hrs; writeJob->usedBufferSize = decodedBytes; - WritePool_queueAndReacquireWriteJob(&writeJob); + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); filesize += decodedBytes; hrs = UTIL_makeHumanReadableSize(filesize); DISPLAYUPDATE(2, "\rDecompressed : %.*f%s ", hrs.precision, hrs.value, hrs.suffix); @@ -2740,8 +2298,8 @@ FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, } LZ4F_freeDecompressionContext(dCtx); - WritePool_releaseWriteJob(writeJob); - WritePool_sparseWriteEnd(ress->writePoolCtx); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return decodingError ? FIO_ERROR_FRAME_DECODING : filesize; } @@ -2818,7 +2376,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, #endif } else if ((prefs->overwrite) && !strcmp (dstFileName, stdoutmark)) { /* pass-through mode */ return FIO_passThrough(prefs, - ress.writePoolCtx->dstFile, srcFile, + AIO_WritePool_getFile(ress.writeCtx), srcFile, ress.srcBuffer, ress.srcBufferSize, ress.srcBufferLoaded); } else { @@ -2856,7 +2414,7 @@ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, int releaseDstFile = 0; int transferMTime = 0; - if ((ress.writePoolCtx->dstFile == NULL) && (prefs->testMode==0)) { + if ((AIO_WritePool_getFile(ress.writeCtx) == NULL) && (prefs->testMode == 0)) { FILE *dstFile; int dstFilePermissions = DEFAULT_FILE_PERMISSIONS; if ( strcmp(srcFileName, stdinmark) /* special case : don't transfer permissions from stdin */ @@ -2871,7 +2429,7 @@ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName, dstFilePermissions); if (dstFile==NULL) return 1; - WritePool_setDstFile(ress.writePoolCtx, dstFile); + AIO_WritePool_setFile(ress.writeCtx, dstFile); /* Must only be added after FIO_openDstFile() succeeds. * Otherwise we may delete the destination file if it already exists, @@ -2884,7 +2442,7 @@ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, if (releaseDstFile) { clearHandler(); - if (WritePool_closeDstFile(ress.writePoolCtx)) { + if (AIO_WritePool_closeFile(ress.writeCtx)) { DISPLAYLEVEL(1, "zstd: %s: %s \n", dstFileName, strerror(errno)); result = 1; } @@ -3100,14 +2658,14 @@ FIO_decompressMultipleFilenames(FIO_ctx_t* const fCtx, if (!prefs->testMode) { FILE* dstFile = FIO_openDstFile(fCtx, prefs, NULL, outFileName, DEFAULT_FILE_PERMISSIONS); if (dstFile == 0) EXM_THROW(19, "cannot open %s", outFileName); - WritePool_setDstFile(ress.writePoolCtx, dstFile); + AIO_WritePool_setFile(ress.writeCtx, dstFile); } for (; fCtx->currFileIdx < fCtx->nbFilesTotal; fCtx->currFileIdx++) { status = FIO_decompressSrcFile(fCtx, prefs, ress, outFileName, srcNamesTable[fCtx->currFileIdx]); if (!status) fCtx->nbFilesProcessed++; error |= status; } - if ((!prefs->testMode) && (WritePool_closeDstFile(ress.writePoolCtx))) + if ((!prefs->testMode) && (AIO_WritePool_closeFile(ress.writeCtx))) EXM_THROW(72, "Write error : %s : cannot properly close output file", strerror(errno)); } else { diff --git a/programs/fileio.h b/programs/fileio.h index 398937a64..9d6ebb1ac 100644 --- a/programs/fileio.h +++ b/programs/fileio.h @@ -13,6 +13,7 @@ #define FILEIO_H_23981798732 #define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ +#include "fileio_types.h" #include "../lib/zstd.h" /* ZSTD_* */ #if defined (__cplusplus) @@ -53,10 +54,6 @@ extern "C" { /*-************************************* * Types ***************************************/ -typedef enum { FIO_zstdCompression, FIO_gzipCompression, FIO_xzCompression, FIO_lzmaCompression, FIO_lz4Compression } FIO_compressionType_t; - -typedef struct FIO_prefs_s FIO_prefs_t; - FIO_prefs_t* FIO_createPreferences(void); void FIO_freePreferences(FIO_prefs_t* const prefs); @@ -66,9 +63,6 @@ typedef struct FIO_ctx_s FIO_ctx_t; FIO_ctx_t* FIO_createContext(void); void FIO_freeContext(FIO_ctx_t* const fCtx); -typedef struct FIO_display_prefs_s FIO_display_prefs_t; - -typedef enum { FIO_ps_auto, FIO_ps_never, FIO_ps_always } FIO_progressSetting_e; /*-************************************* * Parameters diff --git a/programs/fileio_asyncio.c b/programs/fileio_asyncio.c new file mode 100644 index 000000000..868720a1d --- /dev/null +++ b/programs/fileio_asyncio.c @@ -0,0 +1,365 @@ +/* + * Copyright (c) Yann Collet, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#include "platform.h" +#include /* fprintf, open, fdopen, fread, _fileno, stdin, stdout */ +#include /* malloc, free */ +#include +#include /* errno */ + +#if defined (_MSC_VER) +# include +# include +#endif + +#include "fileio_asyncio.h" +#include "fileio_common.h" + +/* ********************************************************************** + * Sparse write + ************************************************************************/ + +/** AIO_fwriteSparse() : +* @return : storedSkips, +* argument for next call to AIO_fwriteSparse() or AIO_fwriteSparseEnd() */ +unsigned AIO_fwriteSparse(FILE* file, + const void* buffer, size_t bufferSize, + const FIO_prefs_t* const prefs, + unsigned storedSkips) +{ + const size_t* const bufferT = (const size_t*)buffer; /* Buffer is supposed malloc'ed, hence aligned on size_t */ + size_t bufferSizeT = bufferSize / sizeof(size_t); + const size_t* const bufferTEnd = bufferT + bufferSizeT; + const size_t* ptrT = bufferT; + static const size_t segmentSizeT = (32 KB) / sizeof(size_t); /* check every 32 KB */ + + if (prefs->testMode) return 0; /* do not output anything in test mode */ + + if (!prefs->sparseFileSupport) { /* normal write */ + size_t const sizeCheck = fwrite(buffer, 1, bufferSize, file); + if (sizeCheck != bufferSize) + EXM_THROW(70, "Write error : cannot write decoded block : %s", + strerror(errno)); + return 0; + } + + /* avoid int overflow */ + if (storedSkips > 1 GB) { + if (LONG_SEEK(file, 1 GB, SEEK_CUR) != 0) + EXM_THROW(91, "1 GB skip error (sparse file support)"); + storedSkips -= 1 GB; + } + + while (ptrT < bufferTEnd) { + size_t nb0T; + + /* adjust last segment if < 32 KB */ + size_t seg0SizeT = segmentSizeT; + if (seg0SizeT > bufferSizeT) seg0SizeT = bufferSizeT; + bufferSizeT -= seg0SizeT; + + /* count leading zeroes */ + for (nb0T=0; (nb0T < seg0SizeT) && (ptrT[nb0T] == 0); nb0T++) ; + storedSkips += (unsigned)(nb0T * sizeof(size_t)); + + if (nb0T != seg0SizeT) { /* not all 0s */ + size_t const nbNon0ST = seg0SizeT - nb0T; + /* skip leading zeros */ + if (LONG_SEEK(file, storedSkips, SEEK_CUR) != 0) + EXM_THROW(92, "Sparse skip error ; try --no-sparse"); + storedSkips = 0; + /* write the rest */ + if (fwrite(ptrT + nb0T, sizeof(size_t), nbNon0ST, file) != nbNon0ST) + EXM_THROW(93, "Write error : cannot write decoded block : %s", + strerror(errno)); + } + ptrT += seg0SizeT; + } + + { static size_t const maskT = sizeof(size_t)-1; + if (bufferSize & maskT) { + /* size not multiple of sizeof(size_t) : implies end of block */ + const char* const restStart = (const char*)bufferTEnd; + const char* restPtr = restStart; + const char* const restEnd = (const char*)buffer + bufferSize; + assert(restEnd > restStart && restEnd < restStart + sizeof(size_t)); + for ( ; (restPtr < restEnd) && (*restPtr == 0); restPtr++) ; + storedSkips += (unsigned) (restPtr - restStart); + if (restPtr != restEnd) { + /* not all remaining bytes are 0 */ + size_t const restSize = (size_t)(restEnd - restPtr); + if (LONG_SEEK(file, storedSkips, SEEK_CUR) != 0) + EXM_THROW(92, "Sparse skip error ; try --no-sparse"); + if (fwrite(restPtr, 1, restSize, file) != restSize) + EXM_THROW(95, "Write error : cannot write end of decoded block : %s", + strerror(errno)); + storedSkips = 0; + } } } + + return storedSkips; +} + +void AIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned storedSkips) +{ + if (prefs->testMode) assert(storedSkips == 0); + if (storedSkips>0) { + assert(prefs->sparseFileSupport > 0); /* storedSkips>0 implies sparse support is enabled */ + (void)prefs; /* assert can be disabled, in which case prefs becomes unused */ + if (LONG_SEEK(file, storedSkips-1, SEEK_CUR) != 0) + EXM_THROW(69, "Final skip error (sparse file support)"); + /* last zero must be explicitly written, + * so that skipped ones get implicitly translated as zero by FS */ + { const char lastZeroByte[1] = { 0 }; + if (fwrite(lastZeroByte, 1, 1, file) != 1) + EXM_THROW(69, "Write error : cannot write last zero : %s", strerror(errno)); + } } +} + + +/* ********************************************************************** + * AsyncIO functionality + ************************************************************************/ + +/* *********************************** + * General IoPool implementation + *************************************/ + +static IOJob_t *AIO_IOPool_createIoJob(IOPoolCtx_t *ctx, size_t bufferSize) { + void *buffer; + IOJob_t *job; + job = (IOJob_t*) malloc(sizeof(IOJob_t)); + buffer = malloc(bufferSize); + if(!job || !buffer) + EXM_THROW(101, "Allocation error : not enough memory"); + job->buffer = buffer; + job->bufferSize = bufferSize; + job->usedBufferSize = 0; + job->file = NULL; + job->ctx = ctx; + job->offset = 0; + return job; +} + + +/* AIO_IOPool_createThreadPool: + * Creates a thread pool and a mutex for threaded IO pool. + * Displays warning if asyncio is requested but MT isn't available. */ +static void AIO_IOPool_createThreadPool(IOPoolCtx_t *ctx, const FIO_prefs_t *prefs) { + ctx->threadPool = NULL; + if(prefs->asyncIO) { + if (ZSTD_pthread_mutex_init(&ctx->ioJobsMutex, NULL)) + EXM_THROW(102,"Failed creating write availableJobs mutex"); + /* We want MAX_IO_JOBS-2 queue items because we need to always have 1 free buffer to + * decompress into and 1 buffer that's actively written to disk and owned by the writing thread. */ + assert(MAX_IO_JOBS >= 2); + ctx->threadPool = POOL_create(1, MAX_IO_JOBS - 2); + if (!ctx->threadPool) + EXM_THROW(104, "Failed creating writer thread pool"); + } +} + +/* AIO_IOPool_init: + * Allocates and sets and a new write pool including its included availableJobs. */ +static void AIO_IOPool_init(IOPoolCtx_t *ctx, FIO_prefs_t* const prefs, POOL_function poolFunction, size_t bufferSize) { + int i; + AIO_IOPool_createThreadPool(ctx, prefs); + ctx->prefs = prefs; + ctx->poolFunction = poolFunction; + ctx->totalIoJobs = ctx->threadPool ? MAX_IO_JOBS : 1; + ctx->availableJobsCount = ctx->totalIoJobs; + for(i=0; i < ctx->availableJobsCount; i++) { + ctx->availableJobs[i] = AIO_IOPool_createIoJob(ctx, bufferSize); + } + ctx->file = NULL; +} + + +/* AIO_IOPool_releaseIoJob: + * Releases an acquired job back to the pool. Doesn't execute the job. */ +static void AIO_IOPool_releaseIoJob(IOJob_t *job) { + IOPoolCtx_t *ctx = (IOPoolCtx_t *) job->ctx; + if(ctx->threadPool) { + ZSTD_pthread_mutex_lock(&ctx->ioJobsMutex); + assert(ctx->availableJobsCount < MAX_IO_JOBS); + ctx->availableJobs[ctx->availableJobsCount++] = job; + ZSTD_pthread_mutex_unlock(&ctx->ioJobsMutex); + } else { + assert(ctx->availableJobsCount == 0); + ctx->availableJobsCount++; + } +} + +/* AIO_IOPool_join: + * Waits for all tasks in the pool to finish executing. */ +static void AIO_IOPool_join(IOPoolCtx_t* ctx) { + if(ctx->threadPool) + POOL_joinJobs(ctx->threadPool); +} + +/* AIO_IOPool_free: + * Release a previously allocated write thread pool. Makes sure all takss are done and released. */ +static void AIO_IOPool_destroy(IOPoolCtx_t* ctx) { + int i; + if(ctx->threadPool) { + /* Make sure we finish all tasks and then free the resources */ + AIO_IOPool_join(ctx); + /* Make sure we are not leaking availableJobs */ + assert(ctx->availableJobsCount == ctx->totalIoJobs); + POOL_free(ctx->threadPool); + ZSTD_pthread_mutex_destroy(&ctx->ioJobsMutex); + } + assert(ctx->file == NULL); + for(i=0; iavailableJobsCount; i++) { + IOJob_t* job = (IOJob_t*) ctx->availableJobs[i]; + free(job->buffer); + free(job); + } +} + +/* AIO_IOPool_acquireJob: + * Returns an available io job to be used for a future io. */ +static IOJob_t* AIO_IOPool_acquireJob(IOPoolCtx_t *ctx) { + IOJob_t *job; + assert(ctx->file != NULL || ctx->prefs->testMode); + if(ctx->threadPool) { + ZSTD_pthread_mutex_lock(&ctx->ioJobsMutex); + assert(ctx->availableJobsCount > 0); + job = (IOJob_t*) ctx->availableJobs[--ctx->availableJobsCount]; + ZSTD_pthread_mutex_unlock(&ctx->ioJobsMutex); + } else { + assert(ctx->availableJobsCount == 1); + ctx->availableJobsCount--; + job = (IOJob_t*)ctx->availableJobs[0]; + } + job->usedBufferSize = 0; + job->file = ctx->file; + job->offset = 0; + return job; +} + + +/* AIO_IOPool_setFile: + * Sets the destination file for future files in the pool. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. + * Also requires ending of sparse write if a previous file was used in sparse mode. */ +static void AIO_IOPool_setFile(IOPoolCtx_t *ctx, FILE* file) { + assert(ctx!=NULL); + AIO_IOPool_join(ctx); + assert(ctx->availableJobsCount == ctx->totalIoJobs); + ctx->file = file; +} + +static FILE* AIO_IOPool_getFile(IOPoolCtx_t *ctx) { + return ctx->file; +} + +/* AIO_IOPool_enqueueJob: + * Enqueues an io job for execution. + * The queued job shouldn't be used directly after queueing it. */ +static void AIO_IOPool_enqueueJob(IOJob_t *job) { + IOPoolCtx_t* ctx = (IOPoolCtx_t *)job->ctx; + if(ctx->threadPool) + POOL_add(ctx->threadPool, ctx->poolFunction, job); + else + ctx->poolFunction(job); +} + +/* *********************************** + * WritePool implementation + *************************************/ + +/* AIO_WritePool_acquireJob: + * Returns an available write job to be used for a future write. */ +IOJob_t* AIO_WritePool_acquireJob(WritePoolCtx_t *ctx) { + return AIO_IOPool_acquireJob(&ctx->base); +} + +/* AIO_WritePool_enqueueAndReacquireWriteJob: + * Queues a write job for execution and acquires a new one. + * After execution `job`'s pointed value would change to the newly acquired job. + * Make sure to set `usedBufferSize` to the wanted length before call. + * The queued job shouldn't be used directly after queueing it. */ +void AIO_WritePool_enqueueAndReacquireWriteJob(IOJob_t **job) { + AIO_IOPool_enqueueJob(*job); + *job = AIO_IOPool_acquireJob((IOPoolCtx_t *)(*job)->ctx); +} + +/* AIO_WritePool_sparseWriteEnd: + * Ends sparse writes to the current file. + * Blocks on completion of all current write jobs before executing. */ +void AIO_WritePool_sparseWriteEnd(WritePoolCtx_t *ctx) { + assert(ctx != NULL); + if(ctx->base.threadPool) + POOL_joinJobs(ctx->base.threadPool); + AIO_fwriteSparseEnd(ctx->base.prefs, ctx->base.file, ctx->storedSkips); + ctx->storedSkips = 0; +} + +/* AIO_WritePool_setFile: + * Sets the destination file for future writes in the pool. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. + * Also requires ending of sparse write if a previous file was used in sparse mode. */ +void AIO_WritePool_setFile(WritePoolCtx_t *ctx, FILE* file) { + AIO_IOPool_setFile(&ctx->base, file); + assert(ctx->storedSkips == 0); +} + +/* AIO_WritePool_getFile: + * Returns the file the writePool is currently set to write to. */ +FILE* AIO_WritePool_getFile(WritePoolCtx_t *ctx) { + return AIO_IOPool_getFile(&ctx->base); +} + +/* AIO_WritePool_releaseIoJob: + * Releases an acquired job back to the pool. Doesn't execute the job. */ +void AIO_WritePool_releaseIoJob(IOJob_t *job) { + AIO_IOPool_releaseIoJob(job); +} + +/* AIO_WritePool_closeFile: + * Ends sparse write and closes the writePool's current file and sets the file to NULL. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. */ +int AIO_WritePool_closeFile(WritePoolCtx_t *ctx) { + FILE *dstFile = ctx->base.file; + assert(dstFile!=NULL || ctx->base.prefs->testMode!=0); + AIO_WritePool_sparseWriteEnd(ctx); + AIO_IOPool_setFile(&ctx->base, NULL); + return fclose(dstFile); +} + +/* AIO_WritePool_executeWriteJob: + * Executes a write job synchronously. Can be used as a function for a thread pool. */ +static void AIO_WritePool_executeWriteJob(void* opaque){ + IOJob_t* job = (IOJob_t*) opaque; + WritePoolCtx_t* ctx = (WritePoolCtx_t*) job->ctx; + ctx->storedSkips = AIO_fwriteSparse(job->file, job->buffer, job->usedBufferSize, ctx->base.prefs, ctx->storedSkips); + AIO_IOPool_releaseIoJob(job); +} + +/* AIO_WritePool_create: + * Allocates and sets and a new write pool including its included jobs. */ +WritePoolCtx_t* AIO_WritePool_create(FIO_prefs_t* const prefs, size_t bufferSize) { + WritePoolCtx_t* ctx = (WritePoolCtx_t*) malloc(sizeof(WritePoolCtx_t)); + if(!ctx) EXM_THROW(100, "Allocation error : not enough memory"); + AIO_IOPool_init(&ctx->base, prefs, AIO_WritePool_executeWriteJob, bufferSize); + ctx->storedSkips = 0; + return ctx; +} + +/* AIO_WritePool_free: + * Frees and releases a writePool and its resources. Closes destination file if needs to. */ +void AIO_WritePool_free(WritePoolCtx_t* ctx) { + /* Make sure we finish all tasks and then free the resources */ + if(AIO_WritePool_getFile(ctx)) + AIO_WritePool_closeFile(ctx); + AIO_IOPool_destroy(&ctx->base); + assert(ctx->storedSkips==0); + free(ctx); +} diff --git a/programs/fileio_asyncio.h b/programs/fileio_asyncio.h new file mode 100644 index 000000000..3e91164c5 --- /dev/null +++ b/programs/fileio_asyncio.h @@ -0,0 +1,120 @@ +/* + * Copyright (c) Yann Collet, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_FILEIO_ASYNCIO_H +#define ZSTD_FILEIO_ASYNCIO_H + +#if defined (__cplusplus) +extern "C" { +#endif + +#include "../lib/common/mem.h" /* U32, U64 */ +#include "fileio_types.h" +#include "platform.h" +#include "util.h" +#include "../lib/common/pool.h" +#include "../lib/common/threading.h" + +#define MAX_IO_JOBS (10) + +typedef struct { + /* These struct fields should be set only on creation and not changed afterwards */ + POOL_ctx* threadPool; + int totalIoJobs; + FIO_prefs_t* prefs; + POOL_function poolFunction; + + /* Controls the file we currently write to, make changes only by using provided utility functions */ + FILE* file; + + /* The jobs and availableJobsCount fields are accessed by both the main and worker threads and should + * only be mutated after locking the mutex */ + ZSTD_pthread_mutex_t ioJobsMutex; + void* availableJobs[MAX_IO_JOBS]; + int availableJobsCount; +} IOPoolCtx_t; + +typedef struct { + IOPoolCtx_t base; + unsigned storedSkips; +} WritePoolCtx_t; + +typedef struct { + /* These fields are automatically set and shouldn't be changed by non WritePool code. */ + void *ctx; + FILE* file; + void *buffer; + size_t bufferSize; + + /* This field should be changed before a job is queued for execution and should contain the number + * of bytes to write from the buffer. */ + size_t usedBufferSize; + U64 offset; +} IOJob_t; + +/** AIO_fwriteSparse() : +* @return : storedSkips, +* argument for next call to AIO_fwriteSparse() or AIO_fwriteSparseEnd() */ +unsigned AIO_fwriteSparse(FILE* file, + const void* buffer, size_t bufferSize, + const FIO_prefs_t* const prefs, + unsigned storedSkips); + +void AIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned storedSkips); + +/* AIO_WritePool_releaseIoJob: + * Releases an acquired job back to the pool. Doesn't execute the job. */ +void AIO_WritePool_releaseIoJob(IOJob_t *job); + +/* AIO_WritePool_acquireJob: + * Returns an available write job to be used for a future write. */ +IOJob_t* AIO_WritePool_acquireJob(WritePoolCtx_t *ctx); + +/* AIO_WritePool_enqueueAndReacquireWriteJob: + * Enqueues a write job for execution and acquires a new one. + * After execution `job`'s pointed value would change to the newly acquired job. + * Make sure to set `usedBufferSize` to the wanted length before call. + * The queued job shouldn't be used directly after queueing it. */ +void AIO_WritePool_enqueueAndReacquireWriteJob(IOJob_t **job); + +/* AIO_WritePool_sparseWriteEnd: + * Ends sparse writes to the current file. + * Blocks on completion of all current write jobs before executing. */ +void AIO_WritePool_sparseWriteEnd(WritePoolCtx_t *ctx); + +/* AIO_WritePool_setFile: + * Sets the destination file for future writes in the pool. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. + * Also requires ending of sparse write if a previous file was used in sparse mode. */ +void AIO_WritePool_setFile(WritePoolCtx_t *ctx, FILE* file); + +/* AIO_WritePool_getFile: + * Returns the file the writePool is currently set to write to. */ +FILE* AIO_WritePool_getFile(WritePoolCtx_t *ctx); + +/* AIO_WritePool_closeFile: + * Ends sparse write and closes the writePool's current file and sets the file to NULL. + * Requires completion of all queues write jobs and release of all otherwise acquired jobs. */ +int AIO_WritePool_closeFile(WritePoolCtx_t *ctx); + +/* AIO_WritePool_create: + * Allocates and sets and a new write pool including its included jobs. + * bufferSize should be set to the maximal buffer we want to write to at a time. */ +WritePoolCtx_t* AIO_WritePool_create(FIO_prefs_t* const prefs, size_t bufferSize); + +/* AIO_WritePool_free: + * Frees and releases a writePool and its resources. Closes destination file. */ +void AIO_WritePool_free(WritePoolCtx_t* ctx); + +#if defined (__cplusplus) +} +#endif + +#endif /* ZSTD_FILEIO_ASYNCIO_H */ diff --git a/programs/fileio_common.h b/programs/fileio_common.h new file mode 100644 index 000000000..d33c19d7b --- /dev/null +++ b/programs/fileio_common.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) Yann Collet, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_FILEIO_COMMON_H +#define ZSTD_FILEIO_COMMON_H + +#if defined (__cplusplus) +extern "C" { +#endif + +#include "../lib/common/mem.h" /* U32, U64 */ +#include "fileio_types.h" +#include "platform.h" +#include "timefn.h" /* UTIL_getTime, UTIL_clockSpanMicro */ + +/*-************************************* +* Macros +***************************************/ +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) +#undef MAX +#define MAX(a,b) ((a)>(b) ? (a) : (b)) + +extern FIO_display_prefs_t g_display_prefs; + +#define DISPLAY(...) fprintf(stderr, __VA_ARGS__) +#define DISPLAYOUT(...) fprintf(stdout, __VA_ARGS__) +#define DISPLAYLEVEL(l, ...) { if (g_display_prefs.displayLevel>=l) { DISPLAY(__VA_ARGS__); } } + +extern UTIL_time_t g_displayClock; + +#define REFRESH_RATE ((U64)(SEC_TO_MICRO / 6)) +#define READY_FOR_UPDATE() ((g_display_prefs.progressSetting != FIO_ps_never) && UTIL_clockSpanMicro(g_displayClock) > REFRESH_RATE) +#define DELAY_NEXT_UPDATE() { g_displayClock = UTIL_getTime(); } +#define DISPLAYUPDATE(l, ...) { \ + if (g_display_prefs.displayLevel>=l && (g_display_prefs.progressSetting != FIO_ps_never)) { \ + if (READY_FOR_UPDATE() || (g_display_prefs.displayLevel>=4)) { \ + DELAY_NEXT_UPDATE(); \ + DISPLAY(__VA_ARGS__); \ + if (g_display_prefs.displayLevel>=4) fflush(stderr); \ + } } } + +#undef MIN /* in case it would be already defined */ +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + + +#define EXM_THROW(error, ...) \ +{ \ + DISPLAYLEVEL(1, "zstd: "); \ + DISPLAYLEVEL(5, "Error defined at %s, line %i : \n", __FILE__, __LINE__); \ + DISPLAYLEVEL(1, "error %i : ", error); \ + DISPLAYLEVEL(1, __VA_ARGS__); \ + DISPLAYLEVEL(1, " \n"); \ + exit(error); \ +} + +#define CHECK_V(v, f) \ + v = f; \ + if (ZSTD_isError(v)) { \ + DISPLAYLEVEL(5, "%s \n", #f); \ + EXM_THROW(11, "%s", ZSTD_getErrorName(v)); \ + } +#define CHECK(f) { size_t err; CHECK_V(err, f); } + + +/* Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW */ +#if defined(_MSC_VER) && _MSC_VER >= 1400 +# define LONG_SEEK _fseeki64 +# define LONG_TELL _ftelli64 +#elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */ +# define LONG_SEEK fseeko +# define LONG_TELL ftello +#elif defined(__MINGW32__) && !defined(__STRICT_ANSI__) && !defined(__NO_MINGW_LFS) && defined(__MSVCRT__) +# define LONG_SEEK fseeko64 +# define LONG_TELL ftello64 +#elif defined(_WIN32) && !defined(__DJGPP__) +# include + static int LONG_SEEK(FILE* file, __int64 offset, int origin) { + LARGE_INTEGER off; + DWORD method; + off.QuadPart = offset; + if (origin == SEEK_END) + method = FILE_END; + else if (origin == SEEK_CUR) + method = FILE_CURRENT; + else + method = FILE_BEGIN; + + if (SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, NULL, method)) + return 0; + else + return -1; + } + static __int64 LONG_TELL(FILE* file) { + LARGE_INTEGER off, newOff; + off.QuadPart = 0; + newOff.QuadPart = 0; + SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, &newOff, FILE_CURRENT); + return newOff.QuadPart; + } +#else +# define LONG_SEEK fseek +# define LONG_TELL ftell +#endif + +#if defined (__cplusplus) +} +#endif +#endif //ZSTD_FILEIO_COMMON_H diff --git a/programs/fileio_types.h b/programs/fileio_types.h new file mode 100644 index 000000000..1909ab1ab --- /dev/null +++ b/programs/fileio_types.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) Yann Collet, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef FILEIO_TYPES_HEADER +#define FILEIO_TYPES_HEADER + +#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ +#include "../lib/zstd.h" /* ZSTD_* */ + +/*-************************************* +* Parameters: FIO_prefs_t +***************************************/ + +typedef struct FIO_display_prefs_s FIO_display_prefs_t; + +typedef enum { FIO_ps_auto, FIO_ps_never, FIO_ps_always } FIO_progressSetting_e; + +struct FIO_display_prefs_s { + int displayLevel; /* 0 : no display; 1: errors; 2: + result + interaction + warnings; 3: + progression; 4: + information */ + FIO_progressSetting_e progressSetting; +}; + + +typedef enum { FIO_zstdCompression, FIO_gzipCompression, FIO_xzCompression, FIO_lzmaCompression, FIO_lz4Compression } FIO_compressionType_t; + +typedef struct FIO_prefs_s { + + /* Algorithm preferences */ + FIO_compressionType_t compressionType; + U32 sparseFileSupport; /* 0: no sparse allowed; 1: auto (file yes, stdout no); 2: force sparse */ + int dictIDFlag; + int checksumFlag; + int blockSize; + int overlapLog; + U32 adaptiveMode; + U32 useRowMatchFinder; + int rsyncable; + int minAdaptLevel; + int maxAdaptLevel; + int ldmFlag; + int ldmHashLog; + int ldmMinMatch; + int ldmBucketSizeLog; + int ldmHashRateLog; + size_t streamSrcSize; + size_t targetCBlockSize; + int srcSizeHint; + int testMode; + ZSTD_paramSwitch_e literalCompressionMode; + + /* IO preferences */ + U32 removeSrcFile; + U32 overwrite; + U32 asyncIO; + + /* Computation resources preferences */ + unsigned memLimit; + int nbWorkers; + + int excludeCompressedFiles; + int patchFromMode; + int contentSize; + int allowBlockDevices; +} FIO_prefs_t; + +#endif /* FILEIO_TYPES_HEADER */ \ No newline at end of file From 4021b784376c3790c077e9b8deedbb6a4f016687 Mon Sep 17 00:00:00 2001 From: brailovich <91924341+brailovich@users.noreply.github.com> Date: Mon, 24 Jan 2022 17:42:21 -0800 Subject: [PATCH 030/472] fix for error message in recursive mode for an empty folder -r on empty directory resulted in zstd waiting input from stdin. now zstd exits without error and prints a warning message explaining why no processing happened (no files or directories to process). --- programs/zstdcli.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/programs/zstdcli.c b/programs/zstdcli.c index fd563e1c2..34d2fa6e0 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -834,6 +834,7 @@ int main(int argCount, const char* argv[]) size_t streamSrcSize = 0; size_t targetCBlockSize = 0; size_t srcSizeHint = 0; + size_t nbInputFileNames = 0; int dictCLevel = g_defaultDictCLevel; unsigned dictSelect = g_defaultSelectivityLevel; #ifndef ZSTD_NODICT @@ -1256,6 +1257,8 @@ int main(int argCount, const char* argv[]) } } + nbInputFileNames = filenames->tableSize; /* saving number of input files */ + if (recursive) { /* at this stage, filenameTable is a list of paths, which can contain both files and directories */ UTIL_expandFNT(&filenames, followLinks); } @@ -1358,7 +1361,17 @@ int main(int argCount, const char* argv[]) #endif /* No input filename ==> use stdin and stdout */ - if (filenames->tableSize == 0) UTIL_refFilename(filenames, stdinmark); + if (filenames->tableSize == 0) { + /* It is possible that the input + was a number of empty directories. In this case + stdin and stdout should not be used */ + if (nbInputFileNames > 0 ){ + DISPLAYLEVEL(2, "please provide correct input file(s) or non-empty directories -- ignored \n"); + CLEAN_RETURN(2); + } + UTIL_refFilename(filenames, stdinmark); + } + if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName) outFileName = stdoutmark; /* when input is stdin, default output is stdout */ From 87dcd3326a587c7e9d61c2910f38337aa014355d Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sat, 22 Jan 2022 02:30:08 -0800 Subject: [PATCH 031/472] fix sequence compression API in Explicit Delimiter mode --- lib/common/error_private.c | 2 +- lib/compress/zstd_compress.c | 73 +++++++++++++++++++++++++++++++----- lib/zstd.h | 21 ++++++----- 3 files changed, 77 insertions(+), 19 deletions(-) diff --git a/lib/common/error_private.c b/lib/common/error_private.c index 6d1135f8c..38e419d35 100644 --- a/lib/common/error_private.c +++ b/lib/common/error_private.c @@ -27,7 +27,7 @@ const char* ERR_getErrorString(ERR_enum code) case PREFIX(version_unsupported): return "Version not supported"; case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter"; case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding"; - case PREFIX(corruption_detected): return "Corrupted block detected"; + case PREFIX(corruption_detected): return "Input corruption detected"; case PREFIX(checksum_wrong): return "Restored data doesn't match checksum"; case PREFIX(parameter_unsupported): return "Unsupported parameter"; case PREFIX(parameter_outOfBound): return "Parameter is out of bound"; diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 1cb229f7a..fc25d0541 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5752,9 +5752,9 @@ size_t ZSTD_compress2(ZSTD_CCtx* cctx, } typedef struct { - U32 idx; /* Index in array of ZSTD_Sequence */ - U32 posInSequence; /* Position within sequence at idx */ - size_t posInSrc; /* Number of bytes given by sequences provided so far */ + U32 idx; /* Index in array of ZSTD_Sequence */ + U32 posInSequence; /* Position within sequence at idx */ + size_t posInSrc; /* Number of bytes given by sequences provided so far */ } ZSTD_sequencePosition; /* ZSTD_validateSequence() : @@ -5809,6 +5809,8 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, repcodes_t updatedRepcodes; U32 dictSize; + DEBUGLOG(5, "ZSTD_copySequencesToSeqStoreExplicitBlockDelim (blockSize = %zu)", blockSize); + if (cctx->cdict) { dictSize = (U32)cctx->cdict->dictContentSize; } else if (cctx->prefixDict.dict) { @@ -5995,6 +5997,56 @@ static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) return sequenceCopier; } +/* Discover the size of next by searching for the block delimiter. + * Note that a block delimiter must exist in this mode, + * otherwise it's an input error. + * The value retrieved will be later compared to ensure it remains within bounds */ +static size_t +blockSize_explicitDelimiter(const ZSTD_Sequence* inSeqs, size_t inSeqsSize, ZSTD_sequencePosition seqPos) +{ + int end = 0; + size_t blockSize = 0; + size_t spos = seqPos.idx; + assert(spos <= inSeqsSize); + while (spos < inSeqsSize) { + end = (inSeqs[spos].offset == 0); + blockSize += inSeqs[spos].litLength + inSeqs[spos].matchLength; + if (end) { + if (inSeqs[spos].matchLength != 0) + RETURN_ERROR(corruption_detected, "delimiter format error : both matchlength and offset must be == 0"); + break; + } + spos++; + } + if (!end) + RETURN_ERROR(corruption_detected, "Reached end of sequences without finding a block delimiter"); + return blockSize; +} + +/* More a "target" block size */ +static size_t blockSize_noDelimiter(size_t blockSize, size_t remaining) +{ + int const lastBlock = (remaining <= blockSize); + return lastBlock ? remaining : blockSize; +} + +static size_t determine_blockSize(ZSTD_sequenceFormat_e mode, + size_t blockSize, size_t remaining, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, ZSTD_sequencePosition seqPos) +{ + DEBUGLOG(6, "determine_blockSize : remainingSize = %zu", remaining); + if (mode == ZSTD_sf_noBlockDelimiters) + return blockSize_noDelimiter(blockSize, remaining); + { size_t const explicitBlockSize = blockSize_explicitDelimiter(inSeqs, inSeqsSize, seqPos); + FORWARD_IF_ERROR(explicitBlockSize, "Error while determining block size with explicit delimiters"); + if (explicitBlockSize > blockSize) + RETURN_ERROR(corruption_detected, "sequences incorrectly define a too large block"); + if (explicitBlockSize > remaining) + RETURN_ERROR(srcSize_wrong, "sequences define a frame longer than source"); + return explicitBlockSize; + } +} + /* Compress, block-by-block, all of the sequences given. * * Returns the cumulative size of all compressed blocks (including their headers), @@ -6007,9 +6059,6 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, const void* src, size_t srcSize) { size_t cSize = 0; - U32 lastBlock; - size_t blockSize; - size_t compressedSeqsSize; size_t remaining = srcSize; ZSTD_sequencePosition seqPos = {0, 0, 0}; @@ -6029,10 +6078,15 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, } while (remaining) { + size_t compressedSeqsSize; size_t cBlockSize; size_t additionalByteAdjustment; - lastBlock = remaining <= cctx->blockSize; - blockSize = lastBlock ? (U32)remaining : (U32)cctx->blockSize; + size_t blockSize = determine_blockSize(cctx->appliedParams.blockDelimiters, + cctx->blockSize, remaining, + inSeqs, inSeqsSize, seqPos); + U32 const lastBlock = (blockSize == remaining); + assert(blockSize <= remaining); + FORWARD_IF_ERROR(blockSize, "Error while trying to determine block size"); ZSTD_resetSeqStore(&cctx->seqStore); DEBUGLOG(4, "Working on new block. Blocksize: %zu", blockSize); @@ -6113,7 +6167,8 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, return cSize; } -size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstCapacity, +size_t ZSTD_compressSequences(ZSTD_CCtx* cctx, + void* dst, size_t dstCapacity, const ZSTD_Sequence* inSeqs, size_t inSeqsSize, const void* src, size_t srcSize) { diff --git a/lib/zstd.h b/lib/zstd.h index 349d8017f..8e90ae5f9 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -1375,23 +1375,25 @@ typedef enum { } ZSTD_sequenceFormat_e; /*! ZSTD_generateSequences() : - * Generate sequences using ZSTD_compress2, given a source buffer. + * Generate sequences using ZSTD_compress2(), given a source buffer. * * Each block will end with a dummy sequence * with offset == 0, matchLength == 0, and litLength == length of last literals. * litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) * simply acts as a block delimiter. * - * zc can be used to insert custom compression params. - * This function invokes ZSTD_compress2 + * @zc can be used to insert custom compression params. + * This function invokes ZSTD_compress2(). * * The output of this function can be fed into ZSTD_compressSequences() with CCtx * setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters * @return : number of sequences generated */ -ZSTDLIB_STATIC_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs, - size_t outSeqsSize, const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t +ZSTD_generateSequences( ZSTD_CCtx* zc, + ZSTD_Sequence* outSeqs, size_t outSeqsSize, + const void* src, size_t srcSize); /*! ZSTD_mergeBlockDelimiters() : * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals @@ -1432,11 +1434,12 @@ ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, si * Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused. * Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly, * and cannot emit an RLE block that disagrees with the repcode history - * @return : final compressed size or a ZSTD error. + * @return : final compressed size, or a ZSTD error code. */ -ZSTDLIB_STATIC_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize, - const ZSTD_Sequence* inSeqs, size_t inSeqsSize, - const void* src, size_t srcSize); +ZSTDLIB_STATIC_API size_t +ZSTD_compressSequences( ZSTD_CCtx* cctx, void* dst, size_t dstSize, + const ZSTD_Sequence* inSeqs, size_t inSeqsSize, + const void* src, size_t srcSize); /*! ZSTD_writeSkippableFrame() : From fc2ea97442460158a92d1e7b7c26e7486e45a605 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 23 Jan 2022 22:08:20 -0800 Subject: [PATCH 032/472] refactored fuzzer tests for sequence compression api add explicit delimiter mode to libfuzzer test --- lib/common/error_private.c | 2 +- lib/compress/zstd_compress.c | 33 +++--- tests/fuzz/sequence_compression_api.c | 148 ++++++++++++++++---------- tests/fuzzer.c | 68 ++++++------ 4 files changed, 144 insertions(+), 107 deletions(-) diff --git a/lib/common/error_private.c b/lib/common/error_private.c index 38e419d35..94e9d4c48 100644 --- a/lib/common/error_private.c +++ b/lib/common/error_private.c @@ -27,7 +27,7 @@ const char* ERR_getErrorString(ERR_enum code) case PREFIX(version_unsupported): return "Version not supported"; case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter"; case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding"; - case PREFIX(corruption_detected): return "Input corruption detected"; + case PREFIX(corruption_detected): return "Data corruption detected"; case PREFIX(checksum_wrong): return "Restored data doesn't match checksum"; case PREFIX(parameter_unsupported): return "Unsupported parameter"; case PREFIX(parameter_outOfBound): return "Parameter is out of bound"; diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index fc25d0541..c369c84e2 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2598,7 +2598,7 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, entropyWorkspace = count + (MaxSeq + 1); entropyWkspSize -= (MaxSeq + 1) * sizeof(*count); - DEBUGLOG(4, "ZSTD_entropyCompressSeqStore_internal (nbSeq=%zu)", nbSeq); + DEBUGLOG(5, "ZSTD_entropyCompressSeqStore_internal (nbSeq=%zu)", nbSeq); ZSTD_STATIC_ASSERT(HUF_WORKSPACE_SIZE >= (1<= HUF_WORKSPACE_SIZE); @@ -2642,11 +2642,10 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, ZSTD_memcpy(&nextEntropy->fse, &prevEntropy->fse, sizeof(prevEntropy->fse)); return (size_t)(op - ostart); } - { - ZSTD_symbolEncodingTypeStats_t stats; - BYTE* seqHead = op++; + { BYTE* seqHead = op++; /* build stats for sequences */ - stats = ZSTD_buildSequencesStatistics(seqStorePtr, nbSeq, + const ZSTD_symbolEncodingTypeStats_t stats = + ZSTD_buildSequencesStatistics(seqStorePtr, nbSeq, &prevEntropy->fse, &nextEntropy->fse, op, oend, strategy, count, @@ -5997,16 +5996,17 @@ static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) return sequenceCopier; } -/* Discover the size of next by searching for the block delimiter. - * Note that a block delimiter must exist in this mode, +/* Discover the size of next block by searching for the delimiter. + * Note that a block delimiter **must** exist in this mode, * otherwise it's an input error. - * The value retrieved will be later compared to ensure it remains within bounds */ + * The block size retrieved will be later compared to ensure it remains within bounds */ static size_t blockSize_explicitDelimiter(const ZSTD_Sequence* inSeqs, size_t inSeqsSize, ZSTD_sequencePosition seqPos) { int end = 0; size_t blockSize = 0; size_t spos = seqPos.idx; + DEBUGLOG(6, "blockSize_explicitDelimiter : seq %zu / %zu", spos, inSeqsSize); assert(spos <= inSeqsSize); while (spos < inSeqsSize) { end = (inSeqs[spos].offset == 0); @@ -6085,10 +6085,10 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, cctx->blockSize, remaining, inSeqs, inSeqsSize, seqPos); U32 const lastBlock = (blockSize == remaining); - assert(blockSize <= remaining); FORWARD_IF_ERROR(blockSize, "Error while trying to determine block size"); + assert(blockSize <= remaining); ZSTD_resetSeqStore(&cctx->seqStore); - DEBUGLOG(4, "Working on new block. Blocksize: %zu", blockSize); + DEBUGLOG(5, "Working on new block. Blocksize: %zu", blockSize); additionalByteAdjustment = sequenceCopier(cctx, &seqPos, inSeqs, inSeqsSize, ip, blockSize); FORWARD_IF_ERROR(additionalByteAdjustment, "Bad sequence copy"); @@ -6098,7 +6098,7 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, if (blockSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) { cBlockSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock); FORWARD_IF_ERROR(cBlockSize, "Nocompress block failed"); - DEBUGLOG(4, "Block too small, writing out nocompress block: cSize: %zu", cBlockSize); + DEBUGLOG(5, "Block too small, writing out nocompress block: cSize: %zu", cBlockSize); cSize += cBlockSize; ip += blockSize; op += cBlockSize; @@ -6115,7 +6115,7 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, cctx->entropyWorkspace, ENTROPY_WORKSPACE_SIZE /* statically allocated in resetCCtx */, cctx->bmi2); FORWARD_IF_ERROR(compressedSeqsSize, "Compressing sequences of block failed"); - DEBUGLOG(4, "Compressed sequences size: %zu", compressedSeqsSize); + DEBUGLOG(5, "Compressed sequences size: %zu", compressedSeqsSize); if (!cctx->isFirstBlock && ZSTD_maybeRLE(&cctx->seqStore) && @@ -6131,11 +6131,11 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, /* ZSTD_noCompressBlock writes the block header as well */ cBlockSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock); FORWARD_IF_ERROR(cBlockSize, "Nocompress block failed"); - DEBUGLOG(4, "Writing out nocompress block, size: %zu", cBlockSize); + DEBUGLOG(5, "Writing out nocompress block, size: %zu", cBlockSize); } else if (compressedSeqsSize == 1) { cBlockSize = ZSTD_rleCompressBlock(op, dstCapacity, *ip, blockSize, lastBlock); FORWARD_IF_ERROR(cBlockSize, "RLE compress block failed"); - DEBUGLOG(4, "Writing out RLE block, size: %zu", cBlockSize); + DEBUGLOG(5, "Writing out RLE block, size: %zu", cBlockSize); } else { U32 cBlockHeader; /* Error checking and repcodes update */ @@ -6147,11 +6147,11 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, cBlockHeader = lastBlock + (((U32)bt_compressed)<<1) + (U32)(compressedSeqsSize << 3); MEM_writeLE24(op, cBlockHeader); cBlockSize = ZSTD_blockHeaderSize + compressedSeqsSize; - DEBUGLOG(4, "Writing out compressed block, size: %zu", cBlockSize); + DEBUGLOG(5, "Writing out compressed block, size: %zu", cBlockSize); } cSize += cBlockSize; - DEBUGLOG(4, "cSize running total: %zu", cSize); + DEBUGLOG(5, "cSize running total: %zu", cSize); if (lastBlock) { break; @@ -6164,6 +6164,7 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, } } + DEBUGLOG(4, "cSize final total: %zu", cSize); return cSize; } diff --git a/tests/fuzz/sequence_compression_api.c b/tests/fuzz/sequence_compression_api.c index a2959e1ac..b35f5a795 100644 --- a/tests/fuzz/sequence_compression_api.c +++ b/tests/fuzz/sequence_compression_api.c @@ -26,8 +26,8 @@ #include "zstd_helpers.h" #include "fuzz_data_producer.h" -static ZSTD_CCtx *cctx = NULL; -static ZSTD_DCtx *dctx = NULL; +static ZSTD_CCtx* cctx = NULL; +static ZSTD_DCtx* dctx = NULL; static void* literalsBuffer = NULL; static void* generatedSrc = NULL; static ZSTD_Sequence* generatedSequences = NULL; @@ -55,7 +55,7 @@ static uint32_t FUZZ_RDG_rand(uint32_t* src) /* Make a pseudorandom string - this simple function exists to avoid * taking a dependency on datagen.h to have RDG_genBuffer(). */ -static char *generatePseudoRandomString(char *str, size_t size) { +static char* generatePseudoRandomString(char* str, size_t size) { const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK1234567890!@#$^&*()_"; uint32_t seed = 0; if (size) { @@ -69,7 +69,10 @@ static char *generatePseudoRandomString(char *str, size_t size) { /* Returns size of source buffer */ static size_t decodeSequences(void* dst, size_t nbSequences, - size_t literalsSize, const void* dict, size_t dictSize) { + size_t literalsSize, + const void* dict, size_t dictSize, + ZSTD_sequenceFormat_e mode) +{ const uint8_t* litPtr = literalsBuffer; const uint8_t* const litBegin = literalsBuffer; const uint8_t* const litEnd = litBegin + literalsSize; @@ -78,21 +81,20 @@ static size_t decodeSequences(void* dst, size_t nbSequences, const uint8_t* const oend = (uint8_t*)dst + ZSTD_FUZZ_GENERATED_SRC_MAXSIZE; size_t generatedSrcBufferSize = 0; size_t bytesWritten = 0; - uint32_t lastLLSize; for (size_t i = 0; i < nbSequences; ++i) { - FUZZ_ASSERT(generatedSequences[i].matchLength != 0); - FUZZ_ASSERT(generatedSequences[i].offset != 0); + /* block boundary */ + if (generatedSequences[i].offset == 0) + FUZZ_ASSERT(generatedSequences[i].matchLength == 0); if (litPtr + generatedSequences[i].litLength > litEnd) { litPtr = litBegin; } - ZSTD_memcpy(op, litPtr, generatedSequences[i].litLength); + memcpy(op, litPtr, generatedSequences[i].litLength); bytesWritten += generatedSequences[i].litLength; op += generatedSequences[i].litLength; litPtr += generatedSequences[i].litLength; - FUZZ_ASSERT(generatedSequences[i].offset != 0); /* Copy over the match */ { size_t matchLength = generatedSequences[i].matchLength; size_t j = 0; @@ -109,7 +111,7 @@ static size_t decodeSequences(void* dst, size_t nbSequences, } } for (; j < matchLength; ++j) { - op[j] = op[j-(int)generatedSequences[i].offset]; + op[j] = op[j - generatedSequences[i].offset]; } op += j; FUZZ_ASSERT(generatedSequences[i].matchLength == j + k); @@ -118,55 +120,65 @@ static size_t decodeSequences(void* dst, size_t nbSequences, } generatedSrcBufferSize = bytesWritten; FUZZ_ASSERT(litPtr <= litEnd); - lastLLSize = (uint32_t)(litEnd - litPtr); - if (lastLLSize <= oend - op) { - ZSTD_memcpy(op, litPtr, lastLLSize); - generatedSrcBufferSize += lastLLSize; - } + if (mode == ZSTD_sf_noBlockDelimiters) { + const uint32_t lastLLSize = (uint32_t)(litEnd - litPtr); + if (lastLLSize <= oend - op) { + memcpy(op, litPtr, lastLLSize); + generatedSrcBufferSize += lastLLSize; + } } return generatedSrcBufferSize; } /* Returns nb sequences generated - * TODO: Add repcode fuzzing once we support repcode match splits + * Note : random sequences are always valid in ZSTD_sf_noBlockDelimiters mode. + * However, it can fail with ZSTD_sf_explicitBlockDelimiters, + * due to potential lack of space in */ static size_t generateRandomSequences(FUZZ_dataProducer_t* producer, size_t literalsSizeLimit, size_t dictSize, - size_t windowLog) { + size_t windowLog, ZSTD_sequenceFormat_e mode) +{ + const uint32_t repCode = 0; /* not used by sequence ingestion api */ + const uint32_t windowSize = 1 << windowLog; + const uint32_t blockSizeMax = MIN(128 << 10, 1 << windowLog); + uint32_t matchLengthMax = ZSTD_FUZZ_MATCHLENGTH_MAXSIZE; uint32_t bytesGenerated = 0; uint32_t nbSeqGenerated = 0; - uint32_t litLength; - uint32_t matchLength; - uint32_t matchBound; - uint32_t offset; - uint32_t offsetBound; - uint32_t repCode = 0; uint32_t isFirstSequence = 1; - uint32_t windowSize = 1 << windowLog; + uint32_t blockSize = 0; - while (nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ + if (mode == ZSTD_sf_explicitBlockDelimiters) { + /* ensure that no sequence can be larger than one block */ + literalsSizeLimit = MIN(literalsSizeLimit, blockSizeMax/2); + matchLengthMax = MIN(matchLengthMax, blockSizeMax/2); + } + + while ( nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ-1 && bytesGenerated < ZSTD_FUZZ_GENERATED_SRC_MAXSIZE && !FUZZ_dataProducer_empty(producer)) { - matchBound = ZSTD_FUZZ_MATCHLENGTH_MAXSIZE; - litLength = isFirstSequence && dictSize == 0 ? FUZZ_dataProducer_uint32Range(producer, 1, literalsSizeLimit) - : FUZZ_dataProducer_uint32Range(producer, 0, literalsSizeLimit); + uint32_t matchLength; + uint32_t matchBound = matchLengthMax; + uint32_t offset; + uint32_t offsetBound; + const uint32_t minLitLength = (isFirstSequence && (dictSize == 0)); + const uint32_t litLength = FUZZ_dataProducer_uint32Range(producer, minLitLength, (uint32_t)literalsSizeLimit); bytesGenerated += litLength; if (bytesGenerated > ZSTD_FUZZ_GENERATED_SRC_MAXSIZE) { break; } - offsetBound = bytesGenerated > windowSize ? windowSize : bytesGenerated + dictSize; + offsetBound = (bytesGenerated > windowSize) ? windowSize : bytesGenerated + (uint32_t)dictSize; offset = FUZZ_dataProducer_uint32Range(producer, 1, offsetBound); if (dictSize > 0 && bytesGenerated <= windowSize) { /* Prevent match length from being such that it would be associated with an offset too large * from the decoder's perspective. If not possible (match would be too small), * then reduce the offset if necessary. */ - size_t bytesToReachWindowSize = windowSize - bytesGenerated; + const size_t bytesToReachWindowSize = windowSize - bytesGenerated; if (bytesToReachWindowSize < ZSTD_MINMATCH_MIN) { - uint32_t newOffsetBound = offsetBound > windowSize ? windowSize : offsetBound; + const uint32_t newOffsetBound = offsetBound > windowSize ? windowSize : offsetBound; offset = FUZZ_dataProducer_uint32Range(producer, 1, newOffsetBound); } else { - matchBound = bytesToReachWindowSize > ZSTD_FUZZ_MATCHLENGTH_MAXSIZE ? - ZSTD_FUZZ_MATCHLENGTH_MAXSIZE : bytesToReachWindowSize; + matchBound = MIN(matchLengthMax, (uint32_t)bytesToReachWindowSize); } } matchLength = FUZZ_dataProducer_uint32Range(producer, ZSTD_MINMATCH_MIN, matchBound); @@ -174,9 +186,35 @@ static size_t generateRandomSequences(FUZZ_dataProducer_t* producer, if (bytesGenerated > ZSTD_FUZZ_GENERATED_SRC_MAXSIZE) { break; } - ZSTD_Sequence seq = {offset, litLength, matchLength, repCode}; - generatedSequences[nbSeqGenerated++] = seq; - isFirstSequence = 0; + { ZSTD_Sequence seq = {offset, litLength, matchLength, repCode}; + const uint32_t lastLits = FUZZ_dataProducer_uint32Range(producer, 0, litLength); + #define SPLITPROB 6000 + #define SPLITMARK 5234 + const int split = (FUZZ_dataProducer_uint32Range(producer, 0, SPLITPROB) == SPLITMARK); + if (mode == ZSTD_sf_explicitBlockDelimiters) { + const size_t seqSize = seq.litLength + seq.matchLength; + if (blockSize + seqSize > blockSizeMax) { /* reaching limit : must end block now */ + const ZSTD_Sequence endBlock = {0, 0, 0, 0}; + generatedSequences[nbSeqGenerated++] = endBlock; + blockSize = seqSize; + } + if (split) { + const ZSTD_Sequence endBlock = {0, lastLits, 0, 0}; + generatedSequences[nbSeqGenerated++] = endBlock; + assert(lastLits <= seq.litLength); + seq.litLength -= lastLits; + blockSize = seqSize - lastLits; + } else { + blockSize += seqSize; + } + } + generatedSequences[nbSeqGenerated++] = seq; + isFirstSequence = 0; + } } + if (mode == ZSTD_sf_explicitBlockDelimiters) { + /* always end sequences with a block delimiter */ + const ZSTD_Sequence endBlock = {0, 0, 0, 0}; + generatedSequences[nbSeqGenerated++] = endBlock; } return nbSeqGenerated; @@ -187,12 +225,11 @@ static size_t roundTripTest(void *result, size_t resultCapacity, size_t srcSize, const void *dict, size_t dictSize, size_t generatedSequencesSize, - size_t wLog, unsigned cLevel, unsigned hasDict) + int wLog, int cLevel, unsigned hasDict, + ZSTD_sequenceFormat_e mode) { size_t cSize; size_t dSize; - ZSTD_CDict* cdict = NULL; - ZSTD_DDict* ddict = NULL; ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 0); @@ -200,8 +237,7 @@ static size_t roundTripTest(void *result, size_t resultCapacity, ZSTD_CCtx_setParameter(cctx, ZSTD_c_windowLog, wLog); ZSTD_CCtx_setParameter(cctx, ZSTD_c_minMatch, ZSTD_MINMATCH_MIN); ZSTD_CCtx_setParameter(cctx, ZSTD_c_validateSequences, 1); - /* TODO: Add block delim mode fuzzing */ - ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_noBlockDelimiters); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, mode); if (hasDict) { FUZZ_ZASSERT(ZSTD_CCtx_loadDictionary(cctx, dict, dictSize)); FUZZ_ZASSERT(ZSTD_DCtx_loadDictionary(dctx, dict, dictSize)); @@ -214,16 +250,10 @@ static size_t roundTripTest(void *result, size_t resultCapacity, dSize = ZSTD_decompressDCtx(dctx, result, resultCapacity, compressed, cSize); FUZZ_ZASSERT(dSize); - if (cdict) { - ZSTD_freeCDict(cdict); - } - if (ddict) { - ZSTD_freeDDict(ddict); - } return dSize; } -int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) +int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size) { void* rBuf; size_t rBufSize; @@ -231,15 +261,18 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) size_t cBufSize; size_t generatedSrcSize; size_t nbSequences; - void* dictBuffer; + void* dictBuffer = NULL; size_t dictSize = 0; unsigned hasDict; unsigned wLog; int cLevel; + ZSTD_sequenceFormat_e mode; - FUZZ_dataProducer_t *producer = FUZZ_dataProducer_create(src, size); + FUZZ_dataProducer_t* const producer = FUZZ_dataProducer_create(src, size); + FUZZ_ASSERT(producer); if (literalsBuffer == NULL) { literalsBuffer = FUZZ_malloc(ZSTD_FUZZ_GENERATED_LITERALS_SIZE); + FUZZ_ASSERT(literalsBuffer); literalsBuffer = generatePseudoRandomString(literalsBuffer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE); } @@ -247,11 +280,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) if (hasDict) { dictSize = FUZZ_dataProducer_uint32Range(producer, 1, ZSTD_FUZZ_GENERATED_DICT_MAXSIZE); dictBuffer = FUZZ_malloc(dictSize); + FUZZ_ASSERT(dictBuffer); dictBuffer = generatePseudoRandomString(dictBuffer, dictSize); } /* Generate window log first so we dont generate offsets too large */ wLog = FUZZ_dataProducer_uint32Range(producer, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX_32); cLevel = FUZZ_dataProducer_int32Range(producer, -3, 22); + mode = (ZSTD_sequenceFormat_e)FUZZ_dataProducer_int32Range(producer, 0, 1); if (!generatedSequences) { generatedSequences = FUZZ_malloc(sizeof(ZSTD_Sequence)*ZSTD_FUZZ_MAX_NBSEQ); @@ -259,8 +294,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) if (!generatedSrc) { generatedSrc = FUZZ_malloc(ZSTD_FUZZ_GENERATED_SRC_MAXSIZE); } - nbSequences = generateRandomSequences(producer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictSize, wLog); - generatedSrcSize = decodeSequences(generatedSrc, nbSequences, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictBuffer, dictSize); + nbSequences = generateRandomSequences(producer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictSize, wLog, mode); + generatedSrcSize = decodeSequences(generatedSrc, nbSequences, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictBuffer, dictSize, mode); cBufSize = ZSTD_compressBound(generatedSrcSize); cBuf = FUZZ_malloc(cBufSize); @@ -276,14 +311,15 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size) FUZZ_ASSERT(dctx); } - size_t const result = roundTripTest(rBuf, rBufSize, + { const size_t result = roundTripTest(rBuf, rBufSize, cBuf, cBufSize, generatedSrcSize, dictBuffer, dictSize, nbSequences, - wLog, cLevel, hasDict); - FUZZ_ZASSERT(result); - FUZZ_ASSERT_MSG(result == generatedSrcSize, "Incorrect regenerated size"); + (int)wLog, cLevel, hasDict, mode); + FUZZ_ZASSERT(result); + FUZZ_ASSERT_MSG(result == generatedSrcSize, "Incorrect regenerated size"); + } FUZZ_ASSERT_MSG(!FUZZ_memcmp(generatedSrc, rBuf, generatedSrcSize), "Corruption!"); free(rBuf); diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 823db775f..134a40468 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -3114,18 +3114,17 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : ZSTD_getSequences followed by ZSTD_compressSequences : ", testNb++); { - size_t srcSize = 500 KB; - BYTE* src = (BYTE*)CNBuffer; - BYTE* dst = (BYTE*)compressedBuffer; - size_t dstSize = ZSTD_compressBound(srcSize); - size_t decompressSize = srcSize; - char* decompressBuffer = (char*)malloc(decompressSize); + const size_t srcSize = 500 KB; + const BYTE* const src = (BYTE*)CNBuffer; + BYTE* const dst = (BYTE*)compressedBuffer; + const size_t dstCapacity = ZSTD_compressBound(srcSize); + const size_t decompressSize = srcSize; + char* const decompressBuffer = (char*)malloc(decompressSize); size_t compressedSize; - size_t dSize; - ZSTD_CCtx* cctx = ZSTD_createCCtx(); - ZSTD_Sequence* seqs = (ZSTD_Sequence*)malloc(srcSize * sizeof(ZSTD_Sequence)); - size_t seqsSize; + ZSTD_CCtx* const cctx = ZSTD_createCCtx(); + ZSTD_Sequence* const seqs = (ZSTD_Sequence*)malloc(srcSize * sizeof(ZSTD_Sequence)); + size_t nbSeqs; if (seqs == NULL) goto _output_error; assert(cctx != NULL); @@ -3133,36 +3132,37 @@ static int basicUnitTests(U32 const seed, double compressibility) /* Populate src with random data */ RDG_genBuffer(CNBuffer, srcSize, compressibility, 0., seed); - /* Test with block delimiters roundtrip */ - seqsSize = ZSTD_generateSequences(cctx, seqs, srcSize, src, srcSize); + /* Roundtrip Test with block delimiters generated by ZSTD_generateSequences() */ + nbSeqs = ZSTD_generateSequences(cctx, seqs, srcSize, src, srcSize); ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_explicitBlockDelimiters); - compressedSize = ZSTD_compressSequences(cctx, dst, dstSize, seqs, seqsSize, src, srcSize); + compressedSize = ZSTD_compressSequences(cctx, dst, dstCapacity, seqs, nbSeqs, src, srcSize); if (ZSTD_isError(compressedSize)) { DISPLAY("Error in sequence compression with block delims\n"); goto _output_error; } - dSize = ZSTD_decompress(decompressBuffer, decompressSize, dst, compressedSize); - if (ZSTD_isError(dSize)) { - DISPLAY("Error in sequence compression roundtrip with block delims\n"); - goto _output_error; - } + { size_t const dSize = ZSTD_decompress(decompressBuffer, decompressSize, dst, compressedSize); + if (ZSTD_isError(dSize)) { + DISPLAY("Error in sequence compression roundtrip with block delims\n"); + goto _output_error; + } } assert(!memcmp(decompressBuffer, src, srcSize)); - /* Test with no block delimiters roundtrip */ - seqsSize = ZSTD_mergeBlockDelimiters(seqs, seqsSize); - ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); - ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_noBlockDelimiters); - compressedSize = ZSTD_compressSequences(cctx, dst, dstSize, seqs, seqsSize, src, srcSize); + /* Roundtrip Test with no block delimiters */ + { size_t const nbSeqsAfterMerge = ZSTD_mergeBlockDelimiters(seqs, nbSeqs); + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); + ZSTD_CCtx_setParameter(cctx, ZSTD_c_blockDelimiters, ZSTD_sf_noBlockDelimiters); + compressedSize = ZSTD_compressSequences(cctx, dst, dstCapacity, seqs, nbSeqsAfterMerge, src, srcSize); + } if (ZSTD_isError(compressedSize)) { DISPLAY("Error in sequence compression with no block delims\n"); goto _output_error; } - dSize = ZSTD_decompress(decompressBuffer, decompressSize, dst, compressedSize); - if (ZSTD_isError(dSize)) { - DISPLAY("Error in sequence compression roundtrip with no block delims\n"); - goto _output_error; - } + { size_t const dSize = ZSTD_decompress(decompressBuffer, decompressSize, dst, compressedSize); + if (ZSTD_isError(dSize)) { + DISPLAY("Error in sequence compression roundtrip with no block delims\n"); + goto _output_error; + } } assert(!memcmp(decompressBuffer, src, srcSize)); ZSTD_freeCCtx(cctx); @@ -3968,9 +3968,9 @@ static int fuzzerTests(U32 seed, unsigned nbTests, unsigned startTest, U32 const DISPLAYLEVEL(5, "fuzzer t%u: Bufferless streaming compression test \n", testNb); { U32 const testLog = FUZ_rand(&lseed) % maxSrcLog; U32 const dictLog = FUZ_rand(&lseed) % maxSrcLog; - int const cLevel = (FUZ_rand(&lseed) % - (ZSTD_maxCLevel() - - (MAX(testLog, dictLog) / cLevelLimiter))) + + int const cLevel = (int)(FUZ_rand(&lseed) % + ((U32)ZSTD_maxCLevel() - + (MAX(testLog, dictLog) / (U32)cLevelLimiter))) + 1; maxTestSize = FUZ_rLogLength(&lseed, testLog); if (maxTestSize >= dstBufferSize) maxTestSize = dstBufferSize-1; @@ -4066,7 +4066,7 @@ _cleanup: free(cBuffer); free(dstBuffer); free(mirrorBuffer); - return result; + return (int)result; _output_error: result = 1; @@ -4103,7 +4103,7 @@ static unsigned readU32FromChar(const char** stringPtr) { unsigned result = 0; while ((**stringPtr >='0') && (**stringPtr <='9')) - result *= 10, result += **stringPtr - '0', (*stringPtr)++ ; + result *= 10, result += (unsigned)(**stringPtr - '0'), (*stringPtr)++ ; if ((**stringPtr=='K') || (**stringPtr=='M')) { result <<= 10; if (**stringPtr=='M') result <<= 10; @@ -4245,7 +4245,7 @@ int main(int argc, const char** argv) } } if (!result) - result = fuzzerTests(seed, nbTests, testNb, maxDuration, ((double)proba) / 100, bigTests); + result = fuzzerTests(seed, (unsigned)nbTests, (unsigned)testNb, maxDuration, ((double)proba) / 100, bigTests); if (mainPause) { int unused; DISPLAY("Press Enter \n"); From 5684bae4f666f2730f2121048b0aa8472ac30457 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 31 Dec 2021 16:25:12 -0800 Subject: [PATCH 033/472] minor refactoring on streaming compression implementation. --- lib/compress/zstd_compress.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 1cb229f7a..74f0cbfb5 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5325,19 +5325,18 @@ static size_t ZSTD_nextInputSizeHint(const ZSTD_CCtx* cctx) /** ZSTD_compressStream_generic(): * internal function for all *compressStream*() variants - * non-static, because can be called from zstdmt_compress.c - * @return : hint size for next input */ + * @return : hint size for next input to complete ongoing block */ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input, ZSTD_EndDirective const flushMode) { const char* const istart = (const char*)input->src; - const char* const iend = input->size != 0 ? istart + input->size : istart; - const char* ip = input->pos != 0 ? istart + input->pos : istart; + const char* const iend = (istart != NULL) ? istart + input->size : istart; + const char* ip = (istart != NULL) ? istart + input->pos : istart; char* const ostart = (char*)output->dst; - char* const oend = output->size != 0 ? ostart + output->size : ostart; - char* op = output->pos != 0 ? ostart + output->pos : ostart; + char* const oend = (ostart != NULL) ? ostart + output->size : ostart; + char* op = (ostart != NULL) ? ostart + output->pos : ostart; U32 someMoreWork = 1; /* check expectations */ @@ -5515,7 +5514,8 @@ size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuf /* After a compression call set the expected input/output buffer. * This is validated at the start of the next compression call. */ -static void ZSTD_setBufferExpectations(ZSTD_CCtx* cctx, ZSTD_outBuffer const* output, ZSTD_inBuffer const* input) +static void +ZSTD_setBufferExpectations(ZSTD_CCtx* cctx, const ZSTD_outBuffer* output, const ZSTD_inBuffer* input) { if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { cctx->expectedInBuffer = *input; @@ -5550,7 +5550,8 @@ static size_t ZSTD_checkBufferStability(ZSTD_CCtx const* cctx, static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, ZSTD_EndDirective endOp, - size_t inSize) { + size_t inSize) +{ ZSTD_CCtx_params params = cctx->requestedParams; ZSTD_prefixDict const prefixDict = cctx->prefixDict; FORWARD_IF_ERROR( ZSTD_initLocalDict(cctx) , ""); /* Init the local dict if present. */ @@ -5564,9 +5565,9 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, params.compressionLevel = cctx->cdict->compressionLevel; } DEBUGLOG(4, "ZSTD_compressStream2 : transparent init stage"); - if (endOp == ZSTD_e_end) cctx->pledgedSrcSizePlusOne = inSize + 1; /* auto-fix pledgedSrcSize */ - { - size_t const dictSize = prefixDict.dict + if (endOp == ZSTD_e_end) cctx->pledgedSrcSizePlusOne = inSize + 1; /* auto-determine pledgedSrcSize */ + + { size_t const dictSize = prefixDict.dict ? prefixDict.dictSize : (cctx->cdict ? cctx->cdict->dictContentSize : 0); ZSTD_cParamMode_e const mode = ZSTD_getCParamMode(cctx->cdict, ¶ms, cctx->pledgedSrcSizePlusOne - 1); @@ -5607,7 +5608,7 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, cctx->streamStage = zcss_load; cctx->appliedParams = params; } else -#endif +#endif /* ZSTD_MULTITHREAD */ { U64 const pledgedSrcSize = cctx->pledgedSrcSizePlusOne - 1; assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams))); FORWARD_IF_ERROR( ZSTD_compressBegin_internal(cctx, @@ -5699,7 +5700,7 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, ZSTD_setBufferExpectations(cctx, output, input); return flushMin; } -#endif +#endif /* ZSTD_MULTITHREAD */ FORWARD_IF_ERROR( ZSTD_compressStream_generic(cctx, output, input, endOp) , ""); DEBUGLOG(5, "completed ZSTD_compressStream2"); ZSTD_setBufferExpectations(cctx, output, input); From c0c5ffa97385063ce9b24432e7c0c4130ed26e27 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 31 Dec 2021 18:20:36 -0800 Subject: [PATCH 034/472] streaming compression : lazy parameter adaptation with stable input effectively makes ZSTD_c_stableInput compatible ZSTD_compressStream() and zstd_e_continue operation mode. --- lib/compress/zstd_compress.c | 25 ++++++++++++++++--------- lib/zstd.h | 6 +++--- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 74f0cbfb5..724ac3887 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -177,12 +177,9 @@ size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx) if (cctx==NULL) return 0; /* support free on NULL */ RETURN_ERROR_IF(cctx->staticSize, memory_allocation, "not compatible with static CCtx"); - { - int cctxInWorkspace = ZSTD_cwksp_owns_buffer(&cctx->workspace, cctx); + { int cctxInWorkspace = ZSTD_cwksp_owns_buffer(&cctx->workspace, cctx); ZSTD_freeCCtxContent(cctx); - if (!cctxInWorkspace) { - ZSTD_customFree(cctx, cctx->customMem); - } + if (!cctxInWorkspace) ZSTD_customFree(cctx, cctx->customMem); } return 0; } @@ -4487,6 +4484,7 @@ ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, #define ZSTD_USE_CDICT_PARAMS_DICTSIZE_MULTIPLIER (6ULL) /*! ZSTD_compressBegin_internal() : + * Assumption : either @dict OR @cdict (or none) is non-NULL, never both * @return : 0, or an error code */ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, @@ -4567,11 +4565,11 @@ size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, &cctxParams, pledgedSrcSize); } -size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel) +size_t +ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel) { ZSTD_CCtx_params cctxParams; - { - ZSTD_parameters const params = ZSTD_getParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_noAttachDict); + { ZSTD_parameters const params = ZSTD_getParams_internal(compressionLevel, ZSTD_CONTENTSIZE_UNKNOWN, dictSize, ZSTD_cpm_noAttachDict); ZSTD_CCtxParams_init_internal(&cctxParams, ¶ms, (compressionLevel == 0) ? ZSTD_CLEVEL_DEFAULT : compressionLevel); } DEBUGLOG(4, "ZSTD_compressBegin_usingDict (dictSize=%u)", (unsigned)dictSize); @@ -5648,6 +5646,12 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, /* transparent initialization stage */ if (cctx->streamStage == zcss_init) { + if ( (cctx->requestedParams.inBufferMode == ZSTD_bm_stable) /* input is presumed stable, across invocations */ + && (endOp == ZSTD_e_continue) /* more to come */ + && (input->pos < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ + cctx->expectedInBuffer = *input; + return (ZSTD_BLOCKSIZE_MAX - input->pos); /* don't do anything : allows lazy compression parameters adaptation */ + } FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, input->size), "CompressStream2 initialization failed"); ZSTD_setBufferExpectations(cctx, output, input); /* Set initial buffer expectations now that we've initialized */ } @@ -6159,6 +6163,7 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstCapaci /*====== Finalize ======*/ /*! ZSTD_flushStream() : +* Note : not compatible with ZSTD_c_stableInBuffer * @return : amount of data remaining to flush */ size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) { @@ -6169,7 +6174,9 @@ size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) { - ZSTD_inBuffer input = { NULL, 0, 0 }; + ZSTD_inBuffer const nullInput = { NULL, 0, 0 }; + int const stableInput = (zcs->appliedParams.inBufferMode == ZSTD_bm_stable); + ZSTD_inBuffer input = stableInput ? zcs->expectedInBuffer : nullInput; size_t const remainingToFlush = ZSTD_compressStream2(zcs, output, &input, ZSTD_e_end); FORWARD_IF_ERROR( remainingToFlush , "ZSTD_compressStream2 failed"); if (zcs->appliedParams.nbWorkers > 0) return remainingToFlush; /* minimal estimation */ diff --git a/lib/zstd.h b/lib/zstd.h index 349d8017f..f25e17d4b 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -1843,14 +1843,14 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also * avoid the memcpy() from the input buffer to the input window buffer. * - * NOTE: ZSTD_compressStream2() will error if ZSTD_e_end is not used. - * That means this flag cannot be used with ZSTD_compressStream(). + * NOTE: ZSTD_compressStream2() will error if ZSTD_e_flush is used. + * That means this flag cannot be used with ZSTD_flushStream(). * * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using * this flag is ALWAYS memory safe, and will never access out-of-bounds * memory. However, compression WILL fail if you violate the preconditions. * - * WARNING: The data in the ZSTD_inBuffer in the range [dst, dst + pos) MUST + * WARNING: The data in the ZSTD_inBuffer in the range [src, src + pos) MUST * not be modified during compression or you will get data corruption. This * is because zstd needs to reference data in the ZSTD_inBuffer to find * matches. Normally zstd maintains its own window buffer for this purpose, From 37b87add7a158deee06a12743aac11c36c352340 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sat, 1 Jan 2022 23:15:34 -0800 Subject: [PATCH 035/472] make stableSrc compatible with regular streaming API including flushStream(). Now the only condition is for `input.size` to continuously grow. --- lib/compress/zstd_compress.c | 17 +++++++------ lib/zstd.h | 28 ++++++++++----------- tests/zstreamtest.c | 47 +++++++++++++++++++----------------- 3 files changed, 48 insertions(+), 44 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 724ac3887..c1cd53fe7 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5338,7 +5338,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, U32 someMoreWork = 1; /* check expectations */ - DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%u", (unsigned)flushMode); + DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%i", (int)flushMode); if (zcs->appliedParams.inBufferMode == ZSTD_bm_buffered) { assert(zcs->inBuff != NULL); assert(zcs->inBuffSize > 0); @@ -5424,9 +5424,8 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, if (!lastBlock) assert(zcs->inBuffTarget <= zcs->inBuffSize); zcs->inToCompress = zcs->inBuffPos; - } else { + } else { /* !inputBuffered, hence ZSTD_bm_stable */ unsigned const lastBlock = (ip + iSize == iend); - assert(flushMode == ZSTD_e_end /* Already validated */); cSize = lastBlock ? ZSTD_compressEnd(zcs, cDst, oSize, ip, iSize) : ZSTD_compressContinue(zcs, cDst, oSize, ip, iSize); @@ -5533,11 +5532,10 @@ static size_t ZSTD_checkBufferStability(ZSTD_CCtx const* cctx, { if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { ZSTD_inBuffer const expect = cctx->expectedInBuffer; - if (expect.src != input->src || expect.pos != input->pos || expect.size != input->size) + if (expect.src != input->src || expect.pos != input->pos) RETURN_ERROR(srcBuffer_wrong, "ZSTD_c_stableInBuffer enabled but input differs!"); - if (endOp != ZSTD_e_end) - RETURN_ERROR(srcBuffer_wrong, "ZSTD_c_stableInBuffer can only be used with ZSTD_e_end!"); } + (void)endOp; if (cctx->appliedParams.outBufferMode == ZSTD_bm_stable) { size_t const outBufferSize = output->size - output->pos; if (cctx->expectedOutBufferSize != outBufferSize) @@ -5650,7 +5648,7 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, && (endOp == ZSTD_e_continue) /* more to come */ && (input->pos < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ cctx->expectedInBuffer = *input; - return (ZSTD_BLOCKSIZE_MAX - input->pos); /* don't do anything : allows lazy compression parameters adaptation */ + return (ZSTD_BLOCKSIZE_MAX - input->pos); /* don't do anything : allows lazy adaptation of compression parameters */ } FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, input->size), "CompressStream2 initialization failed"); ZSTD_setBufferExpectations(cctx, output, input); /* Set initial buffer expectations now that we've initialized */ @@ -6167,7 +6165,10 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstCapaci * @return : amount of data remaining to flush */ size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) { - ZSTD_inBuffer input = { NULL, 0, 0 }; + ZSTD_inBuffer const nullInput = { NULL, 0, 0 }; + int const stableInput = (zcs->appliedParams.inBufferMode == ZSTD_bm_stable); + ZSTD_inBuffer input = stableInput ? zcs->expectedInBuffer : nullInput; + input.size = input.pos; /* do not ingest more input during flush */ return ZSTD_compressStream2(zcs, output, &input, ZSTD_e_flush); } diff --git a/lib/zstd.h b/lib/zstd.h index f25e17d4b..f503c1708 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -1829,13 +1829,16 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo * Experimental parameter. * Default is 0 == disabled. Set to 1 to enable. * - * Tells the compressor that the ZSTD_inBuffer will ALWAYS be the same - * between calls, except for the modifications that zstd makes to pos (the - * caller must not modify pos). This is checked by the compressor, and - * compression will fail if it ever changes. This means the only flush - * mode that makes sense is ZSTD_e_end, so zstd will error if ZSTD_e_end - * is not used. The data in the ZSTD_inBuffer in the range [src, src + pos) - * MUST not be modified during compression or you will get data corruption. + * Tells the compressor that input data presented with ZSTD_inBuffer + * will ALWAYS be the same between calls. + * Technically, the @src pointer must never be changed, + * and the @pos field can only be updated by zstd. + * However, it's possible to increase the @size field, + * allowing scenarios where more data can be appended after compressions starts. + * These conditions are checked by the compressor, + * and compression will fail if they are not respected. + * Also, data in the ZSTD_inBuffer within the range [src, src + pos) + * MUST not be modified during compression or it will result in data corruption. * * When this flag is enabled zstd won't allocate an input window buffer, * because the user guarantees it can reference the ZSTD_inBuffer until @@ -1843,18 +1846,15 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also * avoid the memcpy() from the input buffer to the input window buffer. * - * NOTE: ZSTD_compressStream2() will error if ZSTD_e_flush is used. - * That means this flag cannot be used with ZSTD_flushStream(). - * * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using * this flag is ALWAYS memory safe, and will never access out-of-bounds - * memory. However, compression WILL fail if you violate the preconditions. + * memory. However, compression WILL fail if conditions are not respected. * * WARNING: The data in the ZSTD_inBuffer in the range [src, src + pos) MUST - * not be modified during compression or you will get data corruption. This - * is because zstd needs to reference data in the ZSTD_inBuffer to find + * not be modified during compression or it sill result in data corruption. + * This is because zstd needs to reference data in the ZSTD_inBuffer to find * matches. Normally zstd maintains its own window buffer for this purpose, - * but passing this flag tells zstd to use the user provided buffer. + * but passing this flag tells zstd to rely on user provided buffer instead. */ #define ZSTD_c_stableInBuffer ZSTD_c_experimentalParam9 diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index 72fd72ea3..66e017c3d 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -613,7 +613,7 @@ static int basicUnitTests(U32 seed, double compressibility) DISPLAYLEVEL(3, "OK (error detected : %s) \n", ZSTD_getErrorName(r)); } } - /* Complex context re-use scenario */ + /* Compression state re-use scenario */ DISPLAYLEVEL(3, "test%3i : context re-use : ", testNb++); ZSTD_freeCStream(zc); zc = ZSTD_createCStream(); @@ -634,8 +634,7 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z( ZSTD_compressStream(zc, &outBuff, &inBuff) ); if (inBuff.pos != inBuff.size) goto _output_error; /* entire input should be consumed */ DISPLAYLEVEL(5, "end1 "); - { size_t const r = ZSTD_endStream(zc, &outBuff); - if (r != 0) goto _output_error; } /* error, or some data not flushed */ + if (ZSTD_endStream(zc, &outBuff) != 0) goto _output_error; /* error, or some data not flushed */ } /* use 2 */ { size_t const inSize = 1025; /* will not continue, because tables auto-adjust and are therefore different size */ @@ -653,8 +652,7 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z( ZSTD_compressStream(zc, &outBuff, &inBuff) ); if (inBuff.pos != inBuff.size) goto _output_error; /* entire input should be consumed */ DISPLAYLEVEL(5, "end2 "); - { size_t const r = ZSTD_endStream(zc, &outBuff); - if (r != 0) goto _output_error; } /* error, or some data not flushed */ + if (ZSTD_endStream(zc, &outBuff) != 0) goto _output_error; /* error, or some data not flushed */ } DISPLAYLEVEL(3, "OK \n"); @@ -786,16 +784,18 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK(!(cSize < ZSTD_compressBound(CNBufferSize)), "cSize too large for test"); CHECK_Z(cSize = ZSTD_compress2(cctx, compressedBuffer, cSize + 4, CNBuffer, CNBufferSize)); CHECK_Z(cctxSize1 = ZSTD_sizeof_CCtx(cctx)); - { ZSTD_CCtx* cctx2 = ZSTD_createCCtx(); + { ZSTD_CCtx* const cctx2 = ZSTD_createCCtx(); + assert(cctx2 != NULL); in.pos = out.pos = 0; CHECK_Z(ZSTD_compressStream2(cctx2, &out, &in, ZSTD_e_continue)); CHECK(!(ZSTD_compressStream2(cctx2, &out, &in, ZSTD_e_end) == 0), "Not finished"); CHECK_Z(cctxSize2 = ZSTD_sizeof_CCtx(cctx2)); ZSTD_freeCCtx(cctx2); } - { ZSTD_CCtx* cctx3 = ZSTD_createCCtx(); + { ZSTD_CCtx* const cctx3 = ZSTD_createCCtx(); ZSTD_parameters params = ZSTD_getParams(0, CNBufferSize, 0); size_t cSize3; + assert(cctx3 != NULL); params.fParams.checksumFlag = 1; cSize3 = ZSTD_compress_advanced(cctx3, compressedBuffer, compressedBufferSize, CNBuffer, CNBufferSize, NULL, 0, params); CHECK_Z(cSize3); @@ -808,8 +808,7 @@ static int basicUnitTests(U32 seed, double compressibility) DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : ZSTD_compress2() doesn't modify user parameters : ", testNb++); - { - int stableInBuffer; + { int stableInBuffer; int stableOutBuffer; CHECK_Z(ZSTD_CCtx_getParameter(cctx, ZSTD_c_stableInBuffer, &stableInBuffer)); CHECK_Z(ZSTD_CCtx_getParameter(cctx, ZSTD_c_stableOutBuffer, &stableOutBuffer)); @@ -870,21 +869,24 @@ static int basicUnitTests(U32 seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() ZSTD_c_stableInBuffer with continue and flush : ", testNb++); + /* stableSrc + streaming */ + DISPLAYLEVEL(3, "test%3i : ZSTD_c_stableInBuffer compatibility with compressStream, flushStream and endStream : ", testNb++); + CHECK_Z( ZSTD_initCStream(cctx, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableInBuffer, 1) ); in.src = CNBuffer; - in.size = CNBufferSize; + in.size = 100; in.pos = 0; - out.pos = 0; - out.size = compressedBufferSize; - CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only)); - { size_t const ret = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_continue); - CHECK(!ZSTD_isError(ret), "Must error"); - CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_srcBuffer_wrong), "Must be this error"); - } - CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_only)); - { size_t const ret = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush); - CHECK(!ZSTD_isError(ret), "Must error"); - CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_srcBuffer_wrong), "Must be this error"); + { ZSTD_outBuffer outBuf; + outBuf.dst = (char*)(compressedBuffer)+cSize; + outBuf.size = ZSTD_compressBound(500); + outBuf.pos = 0; + CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &in) ); + in.size = 200; + CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &in) ); + CHECK_Z( ZSTD_flushStream(cctx, &outBuf) ); + in.size = 300; + CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &in) ); + if (ZSTD_endStream(cctx, &outBuf) != 0) goto _output_error; /* error, or some data not flushed */ } DISPLAYLEVEL(3, "OK \n"); @@ -902,6 +904,7 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableOutBuffer, 1)); in.pos = out.pos = 0; in.size = MIN(CNBufferSize, 10); + out.size = compressedBufferSize; CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush)); in.pos = 0; in.size = CNBufferSize - in.size; From 27d336b099d3e4b19969a24e7425a14af86d4879 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 2 Jan 2022 20:06:46 -0800 Subject: [PATCH 036/472] minor behavior refinements specifically, there is no obligation to start streaming compression with pos=0. stableSrc mode is now compatible with this setup. --- lib/compress/zstd_compress.c | 12 ++++++++---- lib/zstd.h | 2 +- tests/zstreamtest.c | 22 ++++++++++++---------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index c1cd53fe7..015fd23c9 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5630,6 +5630,8 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, return 0; } +/* @return provides a minimum amount of data remaining to be flushed from internal buffers + */ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, ZSTD_outBuffer* output, ZSTD_inBuffer* input, @@ -5644,13 +5646,15 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, /* transparent initialization stage */ if (cctx->streamStage == zcss_init) { + size_t const inputSize = input->size - input->pos; /* no obligation to start from pos==0 */ if ( (cctx->requestedParams.inBufferMode == ZSTD_bm_stable) /* input is presumed stable, across invocations */ - && (endOp == ZSTD_e_continue) /* more to come */ - && (input->pos < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ + && (endOp == ZSTD_e_continue) /* no flush requested, more input to come */ + && (inputSize < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ + /* just wait, allows lazy adaptation of compression parameters */ cctx->expectedInBuffer = *input; - return (ZSTD_BLOCKSIZE_MAX - input->pos); /* don't do anything : allows lazy adaptation of compression parameters */ + return ZSTD_FRAMEHEADERSIZE_MIN(cctx->requestedParams.format); /* at least some header to produce */ } - FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, input->size), "CompressStream2 initialization failed"); + FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, inputSize), "CompressStream2 initialization failed"); ZSTD_setBufferExpectations(cctx, output, input); /* Set initial buffer expectations now that we've initialized */ } /* end of transparent initialization stage */ diff --git a/lib/zstd.h b/lib/zstd.h index f503c1708..c3847a864 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -1851,7 +1851,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo * memory. However, compression WILL fail if conditions are not respected. * * WARNING: The data in the ZSTD_inBuffer in the range [src, src + pos) MUST - * not be modified during compression or it sill result in data corruption. + * not be modified during compression or it will result in data corruption. * This is because zstd needs to reference data in the ZSTD_inBuffer to find * matches. Normally zstd maintains its own window buffer for this purpose, * but passing this flag tells zstd to rely on user provided buffer instead. diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index 66e017c3d..15a5cdb7c 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -873,20 +873,21 @@ static int basicUnitTests(U32 seed, double compressibility) DISPLAYLEVEL(3, "test%3i : ZSTD_c_stableInBuffer compatibility with compressStream, flushStream and endStream : ", testNb++); CHECK_Z( ZSTD_initCStream(cctx, 1) ); CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableInBuffer, 1) ); - in.src = CNBuffer; - in.size = 100; - in.pos = 0; - { ZSTD_outBuffer outBuf; + { ZSTD_inBuffer inBuf; + ZSTD_outBuffer outBuf; + inBuf.src = CNBuffer; + inBuf.size = 100; + inBuf.pos = 0; outBuf.dst = (char*)(compressedBuffer)+cSize; outBuf.size = ZSTD_compressBound(500); outBuf.pos = 0; - CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &in) ); - in.size = 200; - CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &in) ); + CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); + inBuf.size = 200; + CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); CHECK_Z( ZSTD_flushStream(cctx, &outBuf) ); - in.size = 300; - CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &in) ); - if (ZSTD_endStream(cctx, &outBuf) != 0) goto _output_error; /* error, or some data not flushed */ + inBuf.size = 300; + CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); + CHECK(ZSTD_endStream(cctx, &outBuf) != 0, "compression should be successful and fully flushed"); } DISPLAYLEVEL(3, "OK \n"); @@ -902,6 +903,7 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z(ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters)); CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 1)); CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableOutBuffer, 1)); + in.src = CNBuffer; in.pos = out.pos = 0; in.size = MIN(CNBufferSize, 10); out.size = compressedBufferSize; From 4b9d1dd9ffc882ff9ac57e2363a411591a27b886 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 5 Jan 2022 13:21:43 -0800 Subject: [PATCH 037/472] fixed incorrect comment --- lib/compress/zstd_compress.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 015fd23c9..3e20818c6 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -6165,7 +6165,6 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstCapaci /*====== Finalize ======*/ /*! ZSTD_flushStream() : -* Note : not compatible with ZSTD_c_stableInBuffer * @return : amount of data remaining to flush */ size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) { From 8296be4a0a25b6e2f74f1cdd7bd4ae04981f6a45 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 5 Jan 2022 16:34:10 -0800 Subject: [PATCH 038/472] pretend consuming input to provide a sense of forward progress --- lib/compress/zstd_compress.c | 21 +++++++++++++++++---- lib/compress/zstd_compress_internal.h | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 3e20818c6..553a0765d 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5647,15 +5647,28 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, /* transparent initialization stage */ if (cctx->streamStage == zcss_init) { size_t const inputSize = input->size - input->pos; /* no obligation to start from pos==0 */ + size_t const totalInputSize = (cctx->savedInPosPlusOne == 0) ? inputSize : input->size - (cctx->savedInPosPlusOne - 1); if ( (cctx->requestedParams.inBufferMode == ZSTD_bm_stable) /* input is presumed stable, across invocations */ && (endOp == ZSTD_e_continue) /* no flush requested, more input to come */ - && (inputSize < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ - /* just wait, allows lazy adaptation of compression parameters */ + && (totalInputSize < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ + if (cctx->savedInPosPlusOne) { /* not the first time */ + /* check stable source guarantees */ + assert(input->src == cctx->expectedInBuffer.src); + assert(input->pos == cctx->expectedInBuffer.size); + } + /* keep track of first position */ + if (cctx->savedInPosPlusOne == 0) cctx->savedInPosPlusOne = input->pos + 1; cctx->expectedInBuffer = *input; + /* pretend input was consumed, to give a sense forward progress */ + input[0].pos = input[0].size; + /* but actually input wasn't consumed, so keep track of position from where compression shall resume */ + cctx->expectedInBuffer.pos = cctx->savedInPosPlusOne - 1; + /* don't initialize yet, wait for the first block of flush() order, for better parameters adaptation */ return ZSTD_FRAMEHEADERSIZE_MIN(cctx->requestedParams.format); /* at least some header to produce */ } - FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, inputSize), "CompressStream2 initialization failed"); - ZSTD_setBufferExpectations(cctx, output, input); /* Set initial buffer expectations now that we've initialized */ + FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, totalInputSize), "compressStream2 initialization failed"); + cctx->savedInPosPlusOne = 0; + ZSTD_setBufferExpectations(cctx, output, input); /* Set initial buffer expectations now that we've initialized */ } /* end of transparent initialization stage */ diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 9fe3affab..8cc2f81d6 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -411,6 +411,7 @@ struct ZSTD_CCtx_s { /* Stable in/out buffer verification */ ZSTD_inBuffer expectedInBuffer; size_t expectedOutBufferSize; + size_t savedInPosPlusOne; /* 0 == no savedInPos */ /* Dictionary */ ZSTD_localDict localDict; From 270f9bf00595160933652d92a809a2dab61cfeed Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 24 Jan 2022 14:45:22 -0800 Subject: [PATCH 039/472] better consistency in accessing @input as suggested by @terrelln. Also : commented zstreamtest more to ensure ZSTD_stableInBuffer is tested/ --- lib/compress/zstd_compress.c | 2 +- tests/zstreamtest.c | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 553a0765d..7be5d87a7 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5660,7 +5660,7 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, if (cctx->savedInPosPlusOne == 0) cctx->savedInPosPlusOne = input->pos + 1; cctx->expectedInBuffer = *input; /* pretend input was consumed, to give a sense forward progress */ - input[0].pos = input[0].size; + input->pos = input->size; /* but actually input wasn't consumed, so keep track of position from where compression shall resume */ cctx->expectedInBuffer.pos = cctx->savedInPosPlusOne - 1; /* don't initialize yet, wait for the first block of flush() order, for better parameters adaptation */ diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index 15a5cdb7c..1444d27df 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -769,11 +769,12 @@ static int basicUnitTests(U32 seed, double compressibility) } /* Compression with ZSTD_c_stable{In,Out}Buffer */ - { ZSTD_CCtx* cctx = ZSTD_createCCtx(); + { ZSTD_CCtx* const cctx = ZSTD_createCCtx(); ZSTD_inBuffer in; ZSTD_outBuffer out; size_t cctxSize1; size_t cctxSize2; + assert(cctx != NULL); in.src = CNBuffer; in.size = CNBufferSize; out.dst = compressedBuffer; @@ -784,6 +785,7 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK(!(cSize < ZSTD_compressBound(CNBufferSize)), "cSize too large for test"); CHECK_Z(cSize = ZSTD_compress2(cctx, compressedBuffer, cSize + 4, CNBuffer, CNBufferSize)); CHECK_Z(cctxSize1 = ZSTD_sizeof_CCtx(cctx)); + /* @cctxSize2 : sizeof_CCtx when doing full streaming (no stable in/out) */ { ZSTD_CCtx* const cctx2 = ZSTD_createCCtx(); assert(cctx2 != NULL); in.pos = out.pos = 0; @@ -792,16 +794,17 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z(cctxSize2 = ZSTD_sizeof_CCtx(cctx2)); ZSTD_freeCCtx(cctx2); } - { ZSTD_CCtx* const cctx3 = ZSTD_createCCtx(); + /* @cctxSize1 : sizeof_CCtx when doing single-shot compression (no streaming) */ + { ZSTD_CCtx* const cctx1 = ZSTD_createCCtx(); ZSTD_parameters params = ZSTD_getParams(0, CNBufferSize, 0); size_t cSize3; - assert(cctx3 != NULL); + assert(cctx1 != NULL); params.fParams.checksumFlag = 1; - cSize3 = ZSTD_compress_advanced(cctx3, compressedBuffer, compressedBufferSize, CNBuffer, CNBufferSize, NULL, 0, params); + cSize3 = ZSTD_compress_advanced(cctx1, compressedBuffer, compressedBufferSize, CNBuffer, CNBufferSize, NULL, 0, params); CHECK_Z(cSize3); CHECK(!(cSize == cSize3), "Must be same compressed size"); - CHECK(!(cctxSize1 == ZSTD_sizeof_CCtx(cctx3)), "Must be same CCtx size"); - ZSTD_freeCCtx(cctx3); + CHECK(!(cctxSize1 == ZSTD_sizeof_CCtx(cctx1)), "Must be same CCtx size"); + ZSTD_freeCCtx(cctx1); } CHECK(!(cctxSize1 < cctxSize2), "Stable buffers means less allocated size"); CHECK_Z(ZSTD_decompress(decodedBuffer, CNBufferSize, compressedBuffer, cSize)); @@ -891,8 +894,9 @@ static int basicUnitTests(U32 seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() ZSTD_c_stableInBuffer allocated size : ", testNb++); + DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() with ZSTD_c_stableInBuffer: context size : ", testNb++); { size_t const cctxSize = ZSTD_sizeof_CCtx(cctx); + DISPLAYLEVEL(4, "cctxSize1=%zu; cctxSize=%zu; cctxSize2=%zu : ", cctxSize1, cctxSize, cctxSize2); CHECK(!(cctxSize1 < cctxSize), "Must be bigger than single-pass"); CHECK(!(cctxSize < cctxSize2), "Must be smaller than streaming"); cctxSize1 = cctxSize; @@ -925,8 +929,9 @@ static int basicUnitTests(U32 seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() ZSTD_c_stableOutBuffer allocated size : ", testNb++); + DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() with ZSTD_c_stableOutBuffer: context size : ", testNb++); { size_t const cctxSize = ZSTD_sizeof_CCtx(cctx); + DISPLAYLEVEL(4, "cctxSize1=%zu; cctxSize=%zu; cctxSize2=%zu : ", cctxSize1, cctxSize, cctxSize2); CHECK(!(cctxSize1 < cctxSize), "Must be bigger than single-pass and stableInBuffer"); CHECK(!(cctxSize < cctxSize2), "Must be smaller than streaming"); } From c1668a00d2d71915582a22c3c0082f59cfee53bd Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 24 Jan 2022 22:57:55 -0800 Subject: [PATCH 040/472] fix extended case combining stableInBuffer with continue() and flush() modes --- lib/compress/zstd_compress.c | 78 ++++++++++++++++++--------- lib/compress/zstd_compress_internal.h | 2 +- tests/fuzzer.c | 2 +- tests/zstreamtest.c | 12 +++-- 4 files changed, 65 insertions(+), 29 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 7be5d87a7..e2a6d9675 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5316,9 +5316,14 @@ size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel) static size_t ZSTD_nextInputSizeHint(const ZSTD_CCtx* cctx) { - size_t hintInSize = cctx->inBuffTarget - cctx->inBuffPos; - if (hintInSize==0) hintInSize = cctx->blockSize; - return hintInSize; + if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { + return cctx->blockSize - cctx->stableIn_notConsumed; + } + assert(cctx->appliedParams.inBufferMode == ZSTD_bm_buffered); + { size_t hintInSize = cctx->inBuffTarget - cctx->inBuffPos; + if (hintInSize==0) hintInSize = cctx->blockSize; + return hintInSize; + } } /** ZSTD_compressStream_generic(): @@ -5329,16 +5334,23 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, ZSTD_inBuffer* input, ZSTD_EndDirective const flushMode) { - const char* const istart = (const char*)input->src; + const char* const istart = (assert(input != NULL), (const char*)input->src); const char* const iend = (istart != NULL) ? istart + input->size : istart; const char* ip = (istart != NULL) ? istart + input->pos : istart; - char* const ostart = (char*)output->dst; + char* const ostart = (assert(output != NULL), (char*)output->dst); char* const oend = (ostart != NULL) ? ostart + output->size : ostart; char* op = (ostart != NULL) ? ostart + output->pos : ostart; U32 someMoreWork = 1; /* check expectations */ - DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%i", (int)flushMode); + DEBUGLOG(5, "ZSTD_compressStream_generic, flush=%i, srcSize = %zu", (int)flushMode, input->size - input->pos); + assert(zcs != NULL); + if (zcs->appliedParams.inBufferMode == ZSTD_bm_stable) { + assert(input->pos >= zcs->stableIn_notConsumed); + input->pos -= zcs->stableIn_notConsumed; + ip -= zcs->stableIn_notConsumed; + zcs->stableIn_notConsumed = 0; + } if (zcs->appliedParams.inBufferMode == ZSTD_bm_buffered) { assert(zcs->inBuff != NULL); assert(zcs->inBuffSize > 0); @@ -5347,8 +5359,10 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, assert(zcs->outBuff != NULL); assert(zcs->outBuffSize > 0); } - assert(output->pos <= output->size); + if (input->src == NULL) assert(input->size == 0); assert(input->pos <= input->size); + if (output->dst == NULL) assert(output->size == 0); + assert(output->pos <= output->size); assert((U32)flushMode <= (U32)ZSTD_e_end); while (someMoreWork) { @@ -5380,8 +5394,7 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, zcs->inBuff + zcs->inBuffPos, toLoad, ip, iend-ip); zcs->inBuffPos += loaded; - if (loaded != 0) - ip += loaded; + if (ip) ip += loaded; if ( (flushMode == ZSTD_e_continue) && (zcs->inBuffPos < zcs->inBuffTarget) ) { /* not enough input to fill full block : stop here */ @@ -5392,6 +5405,20 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, /* empty */ someMoreWork = 0; break; } + } else { + assert(zcs->appliedParams.inBufferMode == ZSTD_bm_stable); + if ( (flushMode == ZSTD_e_continue) + && ( (size_t)(iend - ip) < zcs->blockSize) ) { + /* can't compress a full block : stop here */ + zcs->stableIn_notConsumed = (size_t)(iend - ip); + ip = iend; /* pretend to have consumed input */ + someMoreWork = 0; break; + } + if ( (flushMode == ZSTD_e_flush) + && (ip == iend) ) { + /* empty */ + someMoreWork = 0; break; + } } /* compress current block (note : this stage cannot be stopped in the middle) */ DEBUGLOG(5, "stream compression stage (flushMode==%u)", flushMode); @@ -5399,9 +5426,8 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, void* cDst; size_t cSize; size_t oSize = oend-op; - size_t const iSize = inputBuffered - ? zcs->inBuffPos - zcs->inToCompress - : MIN((size_t)(iend - ip), zcs->blockSize); + size_t const iSize = inputBuffered ? zcs->inBuffPos - zcs->inToCompress + : MIN((size_t)(iend - ip), zcs->blockSize); if (oSize >= ZSTD_compressBound(iSize) || zcs->appliedParams.outBufferMode == ZSTD_bm_stable) cDst = op; /* compress into output buffer, to skip flush stage */ else @@ -5425,17 +5451,15 @@ static size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs, assert(zcs->inBuffTarget <= zcs->inBuffSize); zcs->inToCompress = zcs->inBuffPos; } else { /* !inputBuffered, hence ZSTD_bm_stable */ - unsigned const lastBlock = (ip + iSize == iend); + unsigned const lastBlock = (flushMode == ZSTD_e_end) && (ip + iSize == iend); cSize = lastBlock ? ZSTD_compressEnd(zcs, cDst, oSize, ip, iSize) : ZSTD_compressContinue(zcs, cDst, oSize, ip, iSize); /* Consume the input prior to error checking to mirror buffered mode. */ - if (iSize > 0) - ip += iSize; + if (ip) ip += iSize; FORWARD_IF_ERROR(cSize, "%s", lastBlock ? "ZSTD_compressEnd failed" : "ZSTD_compressContinue failed"); zcs->frameEnded = lastBlock; - if (lastBlock) - assert(ip == iend); + if (lastBlock) assert(ip == iend); } if (cDst == op) { /* no need to flush */ op += cSize; @@ -5514,6 +5538,7 @@ size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuf static void ZSTD_setBufferExpectations(ZSTD_CCtx* cctx, const ZSTD_outBuffer* output, const ZSTD_inBuffer* input) { + DEBUGLOG(5, "ZSTD_setBufferExpectations (for advanced stable in/out modes)"); if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { cctx->expectedInBuffer = *input; } @@ -5647,27 +5672,25 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, /* transparent initialization stage */ if (cctx->streamStage == zcss_init) { size_t const inputSize = input->size - input->pos; /* no obligation to start from pos==0 */ - size_t const totalInputSize = (cctx->savedInPosPlusOne == 0) ? inputSize : input->size - (cctx->savedInPosPlusOne - 1); + size_t const totalInputSize = inputSize + cctx->stableIn_notConsumed; if ( (cctx->requestedParams.inBufferMode == ZSTD_bm_stable) /* input is presumed stable, across invocations */ && (endOp == ZSTD_e_continue) /* no flush requested, more input to come */ && (totalInputSize < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ - if (cctx->savedInPosPlusOne) { /* not the first time */ + if (cctx->stableIn_notConsumed) { /* not the first time */ /* check stable source guarantees */ assert(input->src == cctx->expectedInBuffer.src); assert(input->pos == cctx->expectedInBuffer.size); } - /* keep track of first position */ - if (cctx->savedInPosPlusOne == 0) cctx->savedInPosPlusOne = input->pos + 1; - cctx->expectedInBuffer = *input; /* pretend input was consumed, to give a sense forward progress */ input->pos = input->size; + /* save stable inBuffer, for later control, and flush/end */ + cctx->expectedInBuffer = *input; /* but actually input wasn't consumed, so keep track of position from where compression shall resume */ - cctx->expectedInBuffer.pos = cctx->savedInPosPlusOne - 1; + cctx->stableIn_notConsumed += inputSize; /* don't initialize yet, wait for the first block of flush() order, for better parameters adaptation */ return ZSTD_FRAMEHEADERSIZE_MIN(cctx->requestedParams.format); /* at least some header to produce */ } FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, endOp, totalInputSize), "compressStream2 initialization failed"); - cctx->savedInPosPlusOne = 0; ZSTD_setBufferExpectations(cctx, output, input); /* Set initial buffer expectations now that we've initialized */ } /* end of transparent initialization stage */ @@ -5681,6 +5704,13 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, ZSTDMT_updateCParams_whileCompressing(cctx->mtctx, &cctx->requestedParams); cctx->cParamsChanged = 0; } + if (cctx->stableIn_notConsumed) { + assert(cctx->appliedParams.inBufferMode == ZSTD_bm_stable); + /* some early data was skipped - make it available for consumption */ + assert(input->pos >= cctx->stableIn_notConsumed); + input->pos -= cctx->stableIn_notConsumed; + cctx->stableIn_notConsumed = 0; + } for (;;) { size_t const ipos = input->pos; size_t const opos = output->pos; diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 8cc2f81d6..efbf89ae3 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -410,8 +410,8 @@ struct ZSTD_CCtx_s { /* Stable in/out buffer verification */ ZSTD_inBuffer expectedInBuffer; + size_t stableIn_notConsumed; /* nb bytes within stable input buffer that are said to be consumed but are not */ size_t expectedOutBufferSize; - size_t savedInPosPlusOne; /* 0 == no savedInPos */ /* Dictionary */ ZSTD_localDict localDict; diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 823db775f..ddb2ad393 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -1206,7 +1206,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : compress a NULL input with each level : ", testNb++); { int level = -1; - ZSTD_CCtx* cctx = ZSTD_createCCtx(); + ZSTD_CCtx* const cctx = ZSTD_createCCtx(); if (!cctx) goto _output_error; for (level = -1; level <= ZSTD_maxCLevel(); ++level) { CHECK_Z( ZSTD_compress(compressedBuffer, compressedBufferSize, NULL, 0, level) ); diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index 1444d27df..e084924b2 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -878,20 +878,26 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableInBuffer, 1) ); { ZSTD_inBuffer inBuf; ZSTD_outBuffer outBuf; + const size_t inputSize = 500; inBuf.src = CNBuffer; inBuf.size = 100; inBuf.pos = 0; outBuf.dst = (char*)(compressedBuffer)+cSize; - outBuf.size = ZSTD_compressBound(500); + outBuf.size = ZSTD_compressBound(inputSize); outBuf.pos = 0; CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); inBuf.size = 200; CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); CHECK_Z( ZSTD_flushStream(cctx, &outBuf) ); - inBuf.size = 300; + inBuf.size = inputSize; CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); CHECK(ZSTD_endStream(cctx, &outBuf) != 0, "compression should be successful and fully flushed"); - } + { void* const verifBuf = (char*)outBuf.dst + outBuf.pos; + const size_t decSize = ZSTD_decompress(verifBuf, inputSize, outBuf.dst, outBuf.pos); + CHECK_Z(decSize); + CHECK(decSize != inputSize, "regenerated %zu bytes, instead of %zu", decSize, inputSize); + CHECK(memcmp(inBuf.src, verifBuf, inputSize) != 0, "regenerated data different from original"); + } } DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() with ZSTD_c_stableInBuffer: context size : ", testNb++); From af3d9c506e5bbfdbf78ce35fe62501c4ae0e19a7 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 26 Jan 2022 10:30:33 -0800 Subject: [PATCH 041/472] added streaming test starting from non-0 pos --- tests/zstreamtest.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index e084924b2..a88ba7ac8 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -878,10 +878,11 @@ static int basicUnitTests(U32 seed, double compressibility) CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableInBuffer, 1) ); { ZSTD_inBuffer inBuf; ZSTD_outBuffer outBuf; + const size_t nonZeroStartPos = 18; const size_t inputSize = 500; inBuf.src = CNBuffer; inBuf.size = 100; - inBuf.pos = 0; + inBuf.pos = nonZeroStartPos; outBuf.dst = (char*)(compressedBuffer)+cSize; outBuf.size = ZSTD_compressBound(inputSize); outBuf.pos = 0; @@ -889,14 +890,15 @@ static int basicUnitTests(U32 seed, double compressibility) inBuf.size = 200; CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); CHECK_Z( ZSTD_flushStream(cctx, &outBuf) ); - inBuf.size = inputSize; + inBuf.size = nonZeroStartPos + inputSize; CHECK_Z( ZSTD_compressStream(cctx, &outBuf, &inBuf) ); CHECK(ZSTD_endStream(cctx, &outBuf) != 0, "compression should be successful and fully flushed"); - { void* const verifBuf = (char*)outBuf.dst + outBuf.pos; + { const void* const realSrcStart = (const char*)inBuf.src + nonZeroStartPos; + void* const verifBuf = (char*)outBuf.dst + outBuf.pos; const size_t decSize = ZSTD_decompress(verifBuf, inputSize, outBuf.dst, outBuf.pos); CHECK_Z(decSize); CHECK(decSize != inputSize, "regenerated %zu bytes, instead of %zu", decSize, inputSize); - CHECK(memcmp(inBuf.src, verifBuf, inputSize) != 0, "regenerated data different from original"); + CHECK(memcmp(realSrcStart, verifBuf, inputSize) != 0, "regenerated data different from original"); } } DISPLAYLEVEL(3, "OK \n"); From b99ece96b99b7015169d5e11d45078f21bfa6bd4 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 26 Jan 2022 10:43:50 -0800 Subject: [PATCH 042/472] converted checks into user validation generating error codes had to create a new error code for this condition, none of the existing ones were fitting enough. --- lib/common/error_private.c | 1 + lib/compress/zstd_compress.c | 4 ++-- lib/zstd_errors.h | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/common/error_private.c b/lib/common/error_private.c index 6d1135f8c..f171e0dce 100644 --- a/lib/common/error_private.c +++ b/lib/common/error_private.c @@ -38,6 +38,7 @@ const char* ERR_getErrorString(ERR_enum code) case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported"; case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large"; case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small"; + case PREFIX(stabilityCondition_notRespected): return "pledged buffer stability condition is not respected"; case PREFIX(dictionary_corrupted): return "Dictionary is corrupted"; case PREFIX(dictionary_wrong): return "Dictionary mismatch"; case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples"; diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index e2a6d9675..57f41a3b3 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5678,8 +5678,8 @@ size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, && (totalInputSize < ZSTD_BLOCKSIZE_MAX) ) { /* not even reached one block yet */ if (cctx->stableIn_notConsumed) { /* not the first time */ /* check stable source guarantees */ - assert(input->src == cctx->expectedInBuffer.src); - assert(input->pos == cctx->expectedInBuffer.size); + RETURN_ERROR_IF(input->src != cctx->expectedInBuffer.src, stabilityCondition_notRespected, "stableInBuffer condition not respected: wrong src pointer"); + RETURN_ERROR_IF(input->pos != cctx->expectedInBuffer.size, stabilityCondition_notRespected, "stableInBuffer condition not respected: externally modified pos"); } /* pretend input was consumed, to give a sense forward progress */ input->pos = input->size; diff --git a/lib/zstd_errors.h b/lib/zstd_errors.h index fa3686b77..2ec0b0ab1 100644 --- a/lib/zstd_errors.h +++ b/lib/zstd_errors.h @@ -66,6 +66,7 @@ typedef enum { ZSTD_error_tableLog_tooLarge = 44, ZSTD_error_maxSymbolValue_tooLarge = 46, ZSTD_error_maxSymbolValue_tooSmall = 48, + ZSTD_error_stabilityCondition_notRespected = 50, ZSTD_error_stage_wrong = 60, ZSTD_error_init_missing = 62, ZSTD_error_memory_allocation = 64, From cbff372d105cb0593af24aba780481c83ef8d2ab Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 26 Jan 2022 11:05:57 -0800 Subject: [PATCH 043/472] added helper function inBuffer_forEndFlush() --- lib/compress/zstd_compress.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 57f41a3b3..6a34beea9 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -6207,13 +6207,18 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstCapaci /*====== Finalize ======*/ +static ZSTD_inBuffer inBuffer_forEndFlush(const ZSTD_CStream* zcs) +{ + const ZSTD_inBuffer nullInput = { NULL, 0, 0 }; + const int stableInput = (zcs->appliedParams.inBufferMode == ZSTD_bm_stable); + return stableInput ? zcs->expectedInBuffer : nullInput; +} + /*! ZSTD_flushStream() : * @return : amount of data remaining to flush */ size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) { - ZSTD_inBuffer const nullInput = { NULL, 0, 0 }; - int const stableInput = (zcs->appliedParams.inBufferMode == ZSTD_bm_stable); - ZSTD_inBuffer input = stableInput ? zcs->expectedInBuffer : nullInput; + ZSTD_inBuffer input = inBuffer_forEndFlush(zcs); input.size = input.pos; /* do not ingest more input during flush */ return ZSTD_compressStream2(zcs, output, &input, ZSTD_e_flush); } @@ -6221,11 +6226,9 @@ size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) { - ZSTD_inBuffer const nullInput = { NULL, 0, 0 }; - int const stableInput = (zcs->appliedParams.inBufferMode == ZSTD_bm_stable); - ZSTD_inBuffer input = stableInput ? zcs->expectedInBuffer : nullInput; + ZSTD_inBuffer input = inBuffer_forEndFlush(zcs); size_t const remainingToFlush = ZSTD_compressStream2(zcs, output, &input, ZSTD_e_end); - FORWARD_IF_ERROR( remainingToFlush , "ZSTD_compressStream2 failed"); + FORWARD_IF_ERROR(remainingToFlush , "ZSTD_compressStream2(,,ZSTD_e_end) failed"); if (zcs->appliedParams.nbWorkers > 0) return remainingToFlush; /* minimal estimation */ /* single thread mode : attempt to calculate remaining to flush more precisely */ { size_t const lastBlockSize = zcs->frameEnded ? 0 : ZSTD_BLOCKHEADERSIZE; From dda4c10f0710d24685ee8490e9715d18300665f1 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 26 Jan 2022 13:33:04 -0800 Subject: [PATCH 044/472] added ZSTD_compressStream2() + ZSTD_c_stableInBuffer test --- tests/zstreamtest.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index a88ba7ac8..dbe2b907a 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -902,6 +902,36 @@ static int basicUnitTests(U32 seed, double compressibility) } } DISPLAYLEVEL(3, "OK \n"); + /* stableSrc + streaming */ + DISPLAYLEVEL(3, "test%3i : ZSTD_c_stableInBuffer compatibility with compressStream2, using different end directives : ", testNb++); + CHECK_Z( ZSTD_initCStream(cctx, 1) ); + CHECK_Z( ZSTD_CCtx_setParameter(cctx, ZSTD_c_stableInBuffer, 1) ); + { ZSTD_inBuffer inBuf; + ZSTD_outBuffer outBuf; + const size_t nonZeroStartPos = 18; + const size_t inputSize = 500; + inBuf.src = CNBuffer; + inBuf.size = 100; + inBuf.pos = nonZeroStartPos; + outBuf.dst = (char*)(compressedBuffer)+cSize; + outBuf.size = ZSTD_compressBound(inputSize); + outBuf.pos = 0; + CHECK_Z( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_continue) ); + inBuf.size = 200; + CHECK_Z( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_continue) ); + CHECK_Z( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_flush) ); + inBuf.size = nonZeroStartPos + inputSize; + CHECK_Z( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_continue) ); + CHECK( ZSTD_compressStream2(cctx, &outBuf, &inBuf, ZSTD_e_end) != 0, "compression should be successful and fully flushed"); + { const void* const realSrcStart = (const char*)inBuf.src + nonZeroStartPos; + void* const verifBuf = (char*)outBuf.dst + outBuf.pos; + const size_t decSize = ZSTD_decompress(verifBuf, inputSize, outBuf.dst, outBuf.pos); + CHECK_Z(decSize); + CHECK(decSize != inputSize, "regenerated %zu bytes, instead of %zu", decSize, inputSize); + CHECK(memcmp(realSrcStart, verifBuf, inputSize) != 0, "regenerated data different from original"); + } } + DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : ZSTD_compressStream2() with ZSTD_c_stableInBuffer: context size : ", testNb++); { size_t const cctxSize = ZSTD_sizeof_CCtx(cctx); DISPLAYLEVEL(4, "cctxSize1=%zu; cctxSize=%zu; cctxSize2=%zu : ", cctxSize1, cctxSize, cctxSize2); From 7616e39f3b5618a20d2c8d059f1369283838cbce Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 20 Jan 2022 21:23:48 -0800 Subject: [PATCH 045/472] adding traces to better track processing of literals --- lib/compress/huf_compress.c | 135 ++++++++++++++++++------- lib/compress/zstd_compress.c | 13 +-- lib/compress/zstd_compress_literals.c | 36 +++++-- lib/decompress/zstd_decompress_block.c | 2 +- lib/zstd.h | 4 +- 5 files changed, 135 insertions(+), 55 deletions(-) diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c index 2b3d6adc2..e9652058d 100644 --- a/lib/compress/huf_compress.c +++ b/lib/compress/huf_compress.c @@ -272,7 +272,7 @@ size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void U32 HUF_getNbBitsFromCTable(HUF_CElt const* CTable, U32 symbolValue) { - const HUF_CElt* ct = CTable + 1; + const HUF_CElt* const ct = CTable + 1; assert(symbolValue <= HUF_SYMBOLVALUE_MAX); return (U32)HUF_getNbBits(ct[symbolValue]); } @@ -287,53 +287,56 @@ typedef struct nodeElt_s { /** * HUF_setMaxHeight(): - * Enforces maxNbBits on the Huffman tree described in huffNode. + * Try to enforce @targetNbBits on the Huffman tree described in @huffNode. * - * It sets all nodes with nbBits > maxNbBits to be maxNbBits. Then it adjusts - * the tree to so that it is a valid canonical Huffman tree. + * It attempts to convert all nodes with nbBits > @targetNbBits + * to employ @targetNbBits instead. Then it adjusts the tree + * so that it remains a valid canonical Huffman tree. * * @pre The sum of the ranks of each symbol == 2^largestBits, * where largestBits == huffNode[lastNonNull].nbBits. * @post The sum of the ranks of each symbol == 2^largestBits, - * where largestBits is the return value <= maxNbBits. + * where largestBits is the return value (expected <= targetNbBits). * - * @param huffNode The Huffman tree modified in place to enforce maxNbBits. + * @param huffNode The Huffman tree modified in place to enforce targetNbBits. + * It's presumed sorted, from most frequent to rarest symbol. * @param lastNonNull The symbol with the lowest count in the Huffman tree. - * @param maxNbBits The maximum allowed number of bits, which the Huffman tree + * @param targetNbBits The allowed number of bits, which the Huffman tree * may not respect. After this function the Huffman tree will - * respect maxNbBits. - * @return The maximum number of bits of the Huffman tree after adjustment, - * necessarily no more than maxNbBits. + * respect targetNbBits. + * @return The maximum number of bits of the Huffman tree after adjustment. */ -static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) +static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 targetNbBits) { const U32 largestBits = huffNode[lastNonNull].nbBits; - /* early exit : no elt > maxNbBits, so the tree is already valid. */ - if (largestBits <= maxNbBits) return largestBits; + /* early exit : no elt > targetNbBits, so the tree is already valid. */ + if (largestBits <= targetNbBits) return largestBits; + + DEBUGLOG(5, "HUF_setMaxHeight (targetNbBits = %u)", targetNbBits); /* there are several too large elements (at least >= 2) */ { int totalCost = 0; - const U32 baseCost = 1 << (largestBits - maxNbBits); + const U32 baseCost = 1 << (largestBits - targetNbBits); int n = (int)lastNonNull; - /* Adjust any ranks > maxNbBits to maxNbBits. + /* Adjust any ranks > targetNbBits to targetNbBits. * Compute totalCost, which is how far the sum of the ranks is * we are over 2^largestBits after adjust the offending ranks. */ - while (huffNode[n].nbBits > maxNbBits) { + while (huffNode[n].nbBits > targetNbBits) { totalCost += baseCost - (1 << (largestBits - huffNode[n].nbBits)); - huffNode[n].nbBits = (BYTE)maxNbBits; + huffNode[n].nbBits = (BYTE)targetNbBits; n--; } - /* n stops at huffNode[n].nbBits <= maxNbBits */ - assert(huffNode[n].nbBits <= maxNbBits); - /* n end at index of smallest symbol using < maxNbBits */ - while (huffNode[n].nbBits == maxNbBits) --n; + /* n stops at huffNode[n].nbBits <= targetNbBits */ + assert(huffNode[n].nbBits <= targetNbBits); + /* n end at index of smallest symbol using < targetNbBits */ + while (huffNode[n].nbBits == targetNbBits) --n; - /* renorm totalCost from 2^largestBits to 2^maxNbBits + /* renorm totalCost from 2^largestBits to 2^targetNbBits * note : totalCost is necessarily a multiple of baseCost */ assert((totalCost & (baseCost - 1)) == 0); - totalCost >>= (largestBits - maxNbBits); + totalCost >>= (largestBits - targetNbBits); assert(totalCost > 0); /* repay normalized cost */ @@ -342,12 +345,12 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) /* Get pos of last (smallest = lowest cum. count) symbol per rank */ ZSTD_memset(rankLast, 0xF0, sizeof(rankLast)); - { U32 currentNbBits = maxNbBits; + { U32 currentNbBits = targetNbBits; int pos; for (pos=n ; pos >= 0; pos--) { if (huffNode[pos].nbBits >= currentNbBits) continue; - currentNbBits = huffNode[pos].nbBits; /* < maxNbBits */ - rankLast[maxNbBits-currentNbBits] = (U32)pos; + currentNbBits = huffNode[pos].nbBits; /* < targetNbBits */ + rankLast[targetNbBits-currentNbBits] = (U32)pos; } } while (totalCost > 0) { @@ -394,7 +397,7 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) rankLast[nBitsToDecrease] = noSymbol; else { rankLast[nBitsToDecrease]--; - if (huffNode[rankLast[nBitsToDecrease]].nbBits != maxNbBits-nBitsToDecrease) + if (huffNode[rankLast[nBitsToDecrease]].nbBits != targetNbBits-nBitsToDecrease) rankLast[nBitsToDecrease] = noSymbol; /* this rank is now empty */ } } /* while (totalCost > 0) */ @@ -406,11 +409,11 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) * TODO. */ while (totalCost < 0) { /* Sometimes, cost correction overshoot */ - /* special case : no rank 1 symbol (using maxNbBits-1); - * let's create one from largest rank 0 (using maxNbBits). + /* special case : no rank 1 symbol (using targetNbBits-1); + * let's create one from largest rank 0 (using targetNbBits). */ if (rankLast[1] == noSymbol) { - while (huffNode[n].nbBits == maxNbBits) n--; + while (huffNode[n].nbBits == targetNbBits) n--; huffNode[n+1].nbBits--; assert(n >= 0); rankLast[1] = (U32)(n+1); @@ -424,7 +427,7 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) } /* repay normalized cost */ } /* there are several too large elements (at least >= 2) */ - return maxNbBits; + return targetNbBits; } typedef struct { @@ -594,6 +597,28 @@ static void HUF_sort(nodeElt huffNode[], const unsigned count[], U32 const maxSy assert(HUF_isSorted(huffNode, maxSymbolValue1)); } + +size_t showHNodeSymbols(const nodeElt* hnode, size_t size) +{ + size_t u; + for (u=0; uhuffNodeTbl; nodeElt* const huffNode = huffNode0+1; int nonNullRank; + DEBUGLOG(5, "HUF_buildCTable_wksp (alphabet size = %u)", maxSymbolValue+1); + /* safety checks */ if (wkspSize < sizeof(HUF_buildCTable_wksp_tables)) - return ERROR(workSpace_tooSmall); + return ERROR(workSpace_tooSmall); if (maxNbBits == 0) maxNbBits = HUF_TABLELOG_DEFAULT; if (maxSymbolValue > HUF_SYMBOLVALUE_MAX) - return ERROR(maxSymbolValue_tooLarge); + return ERROR(maxSymbolValue_tooLarge); ZSTD_memset(huffNode0, 0, sizeof(huffNodeTable)); /* sort, decreasing order */ HUF_sort(huffNode, count, maxSymbolValue, wksp_tables->rankPosition); + DEBUGLOG(6, "sorted symbols completed (%zu symbols)", showHNodeSymbols(huffNode, maxSymbolValue+1)); (void)showHNodeSymbols; /* build tree */ nonNullRank = HUF_buildTree(huffNode, maxSymbolValue); - /* enforce maxTableLog */ + /* determine and enforce maxTableLog */ maxNbBits = HUF_setMaxHeight(huffNode, (U32)nonNullRank, maxNbBits); if (maxNbBits > HUF_TABLELOG_MAX) return ERROR(GENERIC); /* check fit into table */ @@ -1158,6 +1192,28 @@ static size_t HUF_compressCTable_internal( return (size_t)(op-ostart); } +static size_t showU32(const U32* arr, size_t size) +{ + size_t u; + for (u=0; u= 2); if (suspectUncompressible && srcSize >= (SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE * SUSPECT_INCOMPRESSIBLE_SAMPLE_RATIO)) { size_t largestTotal = 0; + DEBUGLOG(5, "input suspected incompressible : sampling to check"); { unsigned maxSymbolValueBegin = maxSymbolValue; CHECK_V_F(largestBegin, HIST_count_simple (table->count, &maxSymbolValueBegin, (const BYTE*)src, SUSPECT_INCOMPRESSIBLE_SAMPLE_SIZE) ); largestTotal += largestBegin; @@ -1227,6 +1285,7 @@ HUF_compress_internal (void* dst, size_t dstSize, if (largest == srcSize) { *ostart = ((const BYTE*)src)[0]; return 1; } /* single symbol, rle */ if (largest <= (srcSize >> 7)+4) return 0; /* heuristic : probably not compressible enough */ } + DEBUGLOG(6, "histogram detail completed (%zu symbols)", showU32(table->count, maxSymbolValue+1)); (void)showU32; /* Check validity of previous table */ if ( repeat @@ -1248,6 +1307,7 @@ HUF_compress_internal (void* dst, size_t dstSize, &table->wksps.buildCTable_wksp, sizeof(table->wksps.buildCTable_wksp)); CHECK_F(maxBits); huffLog = (U32)maxBits; + DEBUGLOG(6, "bit distribution completed (%zu symbols)", showCTableBits(table->CTable + 1, maxSymbolValue+1)); (void)showCTableBits; } /* Zero unused symbols in CTable, so we can check it for validity */ { @@ -1300,6 +1360,7 @@ size_t HUF_compress1X_repeat (void* dst, size_t dstSize, HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2, unsigned suspectUncompressible) { + DEBUGLOG(5, "HUF_compress1X_repeat (srcSize = %zu)", srcSize); return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_singleStream, workSpace, wkspSize, hufTable, @@ -1314,6 +1375,7 @@ size_t HUF_compress4X_wksp (void* dst, size_t dstSize, unsigned maxSymbolValue, unsigned huffLog, void* workSpace, size_t wkspSize) { + DEBUGLOG(5, "HUF_compress4X_wksp (srcSize = %zu)", srcSize); return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_fourStreams, workSpace, wkspSize, @@ -1330,6 +1392,7 @@ size_t HUF_compress4X_repeat (void* dst, size_t dstSize, void* workSpace, size_t wkspSize, HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2, unsigned suspectUncompressible) { + DEBUGLOG(5, "HUF_compress4X_repeat (srcSize = %zu)", srcSize); return HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_fourStreams, workSpace, wkspSize, diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index c369c84e2..c534eb25e 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5850,12 +5850,13 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, return 0; } -/* Returns the number of bytes to move the current read position back by. Only non-zero - * if we ended up splitting a sequence. Otherwise, it may return a ZSTD error if something - * went wrong. +/* Returns the number of bytes to move the current read position back by. + * Only non-zero if we ended up splitting a sequence. + * Otherwise, it may return a ZSTD error if something went wrong. * - * This function will attempt to scan through blockSize bytes represented by the sequences - * in inSeqs, storing any (partial) sequences. + * This function will attempt to scan through blockSize bytes + * represented by the sequences in @inSeqs, + * storing any (partial) sequences. * * Occasionally, we may want to change the actual number of bytes we consumed from inSeqs to * avoid splitting a match, or to avoid splitting a match such that it would produce a match @@ -5883,7 +5884,7 @@ ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* } else { dictSize = 0; } - DEBUGLOG(5, "ZSTD_copySequencesToSeqStore: idx: %u PIS: %u blockSize: %zu", idx, startPosInSequence, blockSize); + DEBUGLOG(5, "ZSTD_copySequencesToSeqStoreNoBlockDelim: idx: %u PIS: %u blockSize: %zu", idx, startPosInSequence, blockSize); DEBUGLOG(5, "Start seq: idx: %u (of: %u ml: %u ll: %u)", idx, inSeqs[idx].offset, inSeqs[idx].matchLength, inSeqs[idx].litLength); ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t)); while (endPosInSequence && idx < inSeqsSize && !finalMatchSplit) { diff --git a/lib/compress/zstd_compress_literals.c b/lib/compress/zstd_compress_literals.c index 52b0a8059..0c1acc407 100644 --- a/lib/compress/zstd_compress_literals.c +++ b/lib/compress/zstd_compress_literals.c @@ -36,7 +36,7 @@ size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src, } ZSTD_memcpy(ostart + flSize, src, srcSize); - DEBUGLOG(5, "Raw literals: %u -> %u", (U32)srcSize, (U32)(srcSize + flSize)); + DEBUGLOG(5, "Raw (uncompressed) literals: %u -> %u", (U32)srcSize, (U32)(srcSize + flSize)); return srcSize + flSize; } @@ -67,6 +67,17 @@ size_t ZSTD_compressRleLiteralsBlock (void* dst, size_t dstCapacity, const void* return flSize+1; } +static size_t showHexa(const void* src, size_t srcSize) +{ + const BYTE* const ip = (const BYTE*)src; + size_t u; + for (u=0; urepeatMode; - int const preferRepeat = strategy < ZSTD_lazy ? srcSize <= 1024 : 0; + int const preferRepeat = (strategy < ZSTD_lazy) ? srcSize <= 1024 : 0; + typedef size_t (*huf_compress_f)(void*, size_t, const void*, size_t, unsigned, unsigned, void*, size_t, HUF_CElt*, HUF_repeat*, int, int, unsigned); + huf_compress_f huf_compress; if (repeat == HUF_repeat_valid && lhSize == 3) singleStream = 1; - cLitSize = singleStream ? - HUF_compress1X_repeat( - ostart+lhSize, dstCapacity-lhSize, src, srcSize, - HUF_SYMBOLVALUE_MAX, HUF_TABLELOG_DEFAULT, entropyWorkspace, entropyWorkspaceSize, - (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2, suspectUncompressible) : - HUF_compress4X_repeat( - ostart+lhSize, dstCapacity-lhSize, src, srcSize, - HUF_SYMBOLVALUE_MAX, HUF_TABLELOG_DEFAULT, entropyWorkspace, entropyWorkspaceSize, - (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, bmi2, suspectUncompressible); + huf_compress = singleStream ? HUF_compress1X_repeat : HUF_compress4X_repeat; + cLitSize = huf_compress(ostart+lhSize, dstCapacity-lhSize, + src, srcSize, + HUF_SYMBOLVALUE_MAX, HUF_TABLELOG_DEFAULT, + entropyWorkspace, entropyWorkspaceSize, + (HUF_CElt*)nextHuf->CTable, + &repeat, preferRepeat, + bmi2, suspectUncompressible); if (repeat != HUF_repeat_none) { /* reused the existing table */ DEBUGLOG(5, "Reusing previous huffman table"); diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index 2e44d30d2..758c7ad99 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -1993,7 +1993,7 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, /* Decode literals section */ { size_t const litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize, dst, dstCapacity, streaming); - DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : %u", (U32)litCSize); + DEBUGLOG(5, "ZSTD_decodeLiteralsBlock : cSize=%u, nbLiterals=%zu", (U32)litCSize, dctx->litSize); if (ZSTD_isError(litCSize)) return litCSize; ip += litCSize; srcSize -= litCSize; diff --git a/lib/zstd.h b/lib/zstd.h index 8e90ae5f9..286785053 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -1409,7 +1409,9 @@ ZSTD_generateSequences( ZSTD_CCtx* zc, ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); /*! ZSTD_compressSequences() : - * Compress an array of ZSTD_Sequence, generated from the original source buffer, into dst. + * Compress an array of ZSTD_Sequence, associted with @src buffer, into dst. + * @src contains the entire input (not just the literals). + * If @srcSize > sum(sequence.length), the remaining bytes are considered all literals * If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) * The entire source is compressed into a single frame. * From 51da2d2ff245be6bcd719ee1f3d4c23225d4e653 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 20 Jan 2022 21:24:33 -0800 Subject: [PATCH 046/472] improved compression of literals in specific corner cases In rare cases, the default huffman depth selector is a bit too harsh, requiring brutal adaptations to the tree, resulting is some loss of compression ratio. This new heuristic avoids the worse cases, favoring compression ratio. As an example, compression of a specific distribution of 771 literals is now improved to 441 bytes, from 601 bytes before. --- lib/compress/huf_compress.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c index e9652058d..e61b39f60 100644 --- a/lib/compress/huf_compress.c +++ b/lib/compress/huf_compress.c @@ -705,6 +705,18 @@ static void HUF_buildCTableFromTree(HUF_CElt* CTable, nodeElt const* huffNode, i CTable[0] = maxNbBits; } +static size_t +HUF_nbSymbolsTooLarge(const nodeElt* hnodes, U32 maxSymbolValue, U32 maxNbBits) +{ + size_t nbSTL = 0; + int s = (int)maxSymbolValue; + for ( ; s > 0; s-- ) { + if (hnodes[s].nbBits > maxNbBits) nbSTL++; + else break; + } + return nbSTL; +} + size_t HUF_buildCTable_wksp(HUF_CElt* CTable, const unsigned* count, U32 maxSymbolValue, U32 maxNbBits, void* workSpace, size_t wkspSize) @@ -733,6 +745,16 @@ HUF_buildCTable_wksp(HUF_CElt* CTable, const unsigned* count, U32 maxSymbolValue nonNullRank = HUF_buildTree(huffNode, maxSymbolValue); /* determine and enforce maxTableLog */ + /* Loosen target when maxNbBits is within limits. + * A harsh rebalancing can be bad for compression ratio + * while a mild one tends to be better */ + while (maxNbBits < HUF_TABLELOG_MAX) { + size_t const nbNodes = HUF_nbSymbolsTooLarge(huffNode, maxSymbolValue, maxNbBits); + #define HUF_NB_NODES_TO_FIX_MAX 8 + if (nbNodes < HUF_NB_NODES_TO_FIX_MAX) /* heuristic */ + break; + maxNbBits++; + } maxNbBits = HUF_setMaxHeight(huffNode, (U32)nonNullRank, maxNbBits); if (maxNbBits > HUF_TABLELOG_MAX) return ERROR(GENERIC); /* check fit into table */ From 4684836f4fbaea1d5416306173306bac56361d83 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 20 Jan 2022 21:59:46 -0800 Subject: [PATCH 047/472] update regression tests minor compression ratio benefits in some cases, no compression ratio regression in the measured scenarios. --- lib/compress/huf_compress.c | 18 +++++++++--------- lib/compress/zstd_compress_literals.c | 2 +- tests/regression/results.csv | 22 +++++++++++----------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c index e61b39f60..fee2c0b52 100644 --- a/lib/compress/huf_compress.c +++ b/lib/compress/huf_compress.c @@ -598,21 +598,21 @@ static void HUF_sort(nodeElt huffNode[], const unsigned count[], U32 const maxSy } -size_t showHNodeSymbols(const nodeElt* hnode, size_t size) +static size_t showHNodeSymbols(const nodeElt* hnode, size_t size) { size_t u; for (u=0; u Date: Thu, 20 Jan 2022 22:19:35 -0800 Subject: [PATCH 048/472] proper max limit to 11 --- lib/compress/huf_compress.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c index fee2c0b52..d3b597d98 100644 --- a/lib/compress/huf_compress.c +++ b/lib/compress/huf_compress.c @@ -745,10 +745,10 @@ HUF_buildCTable_wksp(HUF_CElt* CTable, const unsigned* count, U32 maxSymbolValue nonNullRank = HUF_buildTree(huffNode, maxSymbolValue); /* determine and enforce maxTableLog */ - /* Loosen target when maxNbBits is within limits. + /* Loosen target when maxNbBits is already within limits. * A harsh rebalancing can be bad for compression ratio * while a mild one tends to be better */ - while (maxNbBits < HUF_TABLELOG_MAX) { + while (maxNbBits < HUF_TABLELOG_DEFAULT) { size_t const nbSTL = HUF_nbSymbolsTooLarge(huffNode, maxSymbolValue, maxNbBits); #define HUF_NB_NODES_TO_FIX_MAX 32 if (nbSTL < HUF_NB_NODES_TO_FIX_MAX) /* heuristic */ From e9dd923fa4b87db64ff6c3681194967d5eaaa264 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 21 Jan 2022 16:14:25 -0800 Subject: [PATCH 049/472] only declare debug functions in debug mode --- doc/zstd_manual.html | 4 +- lib/compress/huf_compress.c | 124 ++++++++++++++------------ lib/compress/zstd_compress_internal.h | 8 +- lib/compress/zstd_compress_literals.c | 38 +++++--- lib/compress/zstd_cwksp.h | 2 +- 5 files changed, 100 insertions(+), 76 deletions(-) diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index 9f73c4c81..6b45e0a99 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -1164,7 +1164,9 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
ZSTDLIB_STATIC_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize,
                       const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
                       const void* src, size_t srcSize);
-

Compress an array of ZSTD_Sequence, generated from the original source buffer, into dst. +

Compress an array of ZSTD_Sequence, associted with @src buffer, into dst. + @src contains the entire input (not just the literals). + If @srcSize > sum(sequence.length), the remaining bytes are considered all literals If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) The entire source is compressed into a single frame. diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c index d3b597d98..b533573d1 100644 --- a/lib/compress/huf_compress.c +++ b/lib/compress/huf_compress.c @@ -42,13 +42,67 @@ /* ************************************************************** -* Utils +* Required declarations ****************************************************************/ -unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue) +typedef struct nodeElt_s { + U32 count; + U16 parent; + BYTE byte; + BYTE nbBits; +} nodeElt; + + +/* ************************************************************** +* Debug Traces +****************************************************************/ + +#if DEBUGLEVEL >= 2 + +static size_t showU32(const U32* arr, size_t size) { - return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 1); + size_t u; + for (u=0; u 1) { assert(bucketStartIdx < maxSymbolValue1); @@ -598,27 +645,6 @@ static void HUF_sort(nodeElt huffNode[], const unsigned count[], U32 const maxSy } -static size_t showHNodeSymbols(const nodeElt* hnode, size_t size) -{ - size_t u; - for (u=0; urankPosition); - DEBUGLOG(6, "sorted symbols completed (%zu symbols)", showHNodeSymbols(huffNode, maxSymbolValue+1)); (void)showHNodeSymbols; + DEBUGLOG(6, "sorted symbols completed (%zu symbols)", showHNodeSymbols(huffNode, maxSymbolValue+1)); /* build tree */ nonNullRank = HUF_buildTree(huffNode, maxSymbolValue); @@ -943,7 +969,7 @@ static size_t HUF_closeCStream(HUF_CStream_t* bitC) { size_t const nbBits = bitC->bitPos[0] & 0xFF; if (bitC->ptr >= bitC->endPtr) return 0; /* overflow detected */ - return (bitC->ptr - bitC->startPtr) + (nbBits > 0); + return (size_t)(bitC->ptr - bitC->startPtr) + (nbBits > 0); } } @@ -1214,28 +1240,12 @@ static size_t HUF_compressCTable_internal( return (size_t)(op-ostart); } -static size_t showU32(const U32* arr, size_t size) + +unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue) { - size_t u; - for (u=0; u> 7)+4) return 0; /* heuristic : probably not compressible enough */ } - DEBUGLOG(6, "histogram detail completed (%zu symbols)", showU32(table->count, maxSymbolValue+1)); (void)showU32; + DEBUGLOG(6, "histogram detail completed (%zu symbols)", showU32(table->count, maxSymbolValue+1)); /* Check validity of previous table */ if ( repeat @@ -1329,7 +1339,7 @@ HUF_compress_internal (void* dst, size_t dstSize, &table->wksps.buildCTable_wksp, sizeof(table->wksps.buildCTable_wksp)); CHECK_F(maxBits); huffLog = (U32)maxBits; - DEBUGLOG(6, "bit distribution completed (%zu symbols)", showCTableBits(table->CTable + 1, maxSymbolValue+1)); (void)showCTableBits; + DEBUGLOG(6, "bit distribution completed (%zu symbols)", showCTableBits(table->CTable + 1, maxSymbolValue+1)); } /* Zero unused symbols in CTable, so we can check it for validity */ { diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 9fe3affab..e615b10c2 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -713,7 +713,7 @@ static unsigned ZSTD_NbCommonBytes (size_t val) } # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) - return (__builtin_ctzll((U64)val) >> 3); + return (unsigned)(__builtin_ctzll((U64)val) >> 3); # else static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, 0, 3, 1, 3, 1, 4, 2, 7, @@ -736,7 +736,7 @@ static unsigned ZSTD_NbCommonBytes (size_t val) __assume(0); } # elif defined(__GNUC__) && (__GNUC__ >= 3) - return (__builtin_ctz((U32)val) >> 3); + return (unsigned)(__builtin_ctz((U32)val) >> 3); # else static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, @@ -761,7 +761,7 @@ static unsigned ZSTD_NbCommonBytes (size_t val) } # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) - return (__builtin_clzll(val) >> 3); + return (unsigned)(__builtin_clzll(val) >> 3); # else unsigned r; const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */ @@ -781,7 +781,7 @@ static unsigned ZSTD_NbCommonBytes (size_t val) __assume(0); } # elif defined(__GNUC__) && (__GNUC__ >= 3) - return (__builtin_clz((U32)val) >> 3); + return (unsigned)(__builtin_clz((U32)val) >> 3); # else unsigned r; if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } diff --git a/lib/compress/zstd_compress_literals.c b/lib/compress/zstd_compress_literals.c index a114b7d15..d6d63278a 100644 --- a/lib/compress/zstd_compress_literals.c +++ b/lib/compress/zstd_compress_literals.c @@ -13,6 +13,29 @@ ***************************************/ #include "zstd_compress_literals.h" + +/* ************************************************************** +* Debug Traces +****************************************************************/ +#if DEBUGLEVEL >= 2 + +static size_t showHexa(const void* src, size_t srcSize) +{ + const BYTE* const ip = (const BYTE*)src; + size_t u; + for (u=0; utableValidEnd >= ws->objectEnd); assert(ws->tableValidEnd <= ws->allocStart); if (ws->tableValidEnd < ws->tableEnd) { - ZSTD_memset(ws->tableValidEnd, 0, (BYTE*)ws->tableEnd - (BYTE*)ws->tableValidEnd); + ZSTD_memset(ws->tableValidEnd, 0, (size_t)((BYTE*)ws->tableEnd - (BYTE*)ws->tableValidEnd)); } ZSTD_cwksp_mark_tables_clean(ws); } From 32a5d95dcb873044cb6af4921772510e619ac9e7 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 21 Jan 2022 16:40:30 -0800 Subject: [PATCH 050/472] moved HufLog to lib/decompress it's only used to size decompression tables --- lib/common/zstd_internal.h | 1 - lib/compress/zstd_compress.c | 12 ++++++------ lib/decompress/zstd_decompress_internal.h | 1 + 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/common/zstd_internal.h b/lib/common/zstd_internal.h index e4d36ce09..0594b7fce 100644 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@ -95,7 +95,6 @@ typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e; #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */ -#define HufLog 12 typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e; #define LONGNBSEQ 0x7F00 diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index c534eb25e..e80d453e9 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -746,12 +746,12 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, case ZSTD_c_minMatch : if (value!=0) /* 0 => use default */ BOUNDCHECK(ZSTD_c_minMatch, value); - CCtxParams->cParams.minMatch = value; + CCtxParams->cParams.minMatch = (U32)value; return CCtxParams->cParams.minMatch; case ZSTD_c_targetLength : BOUNDCHECK(ZSTD_c_targetLength, value); - CCtxParams->cParams.targetLength = value; + CCtxParams->cParams.targetLength = (U32)value; return CCtxParams->cParams.targetLength; case ZSTD_c_strategy : @@ -764,12 +764,12 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, /* Content size written in frame header _when known_ (default:1) */ DEBUGLOG(4, "set content size flag = %u", (value!=0)); CCtxParams->fParams.contentSizeFlag = value != 0; - return CCtxParams->fParams.contentSizeFlag; + return (size_t)CCtxParams->fParams.contentSizeFlag; case ZSTD_c_checksumFlag : /* A 32-bits content checksum will be calculated and written at end of frame (default:0) */ CCtxParams->fParams.checksumFlag = value != 0; - return CCtxParams->fParams.checksumFlag; + return (size_t)CCtxParams->fParams.checksumFlag; case ZSTD_c_dictIDFlag : /* When applicable, dictionary's dictID is provided in frame header (default:1) */ DEBUGLOG(4, "set dictIDFlag = %u", (value!=0)); @@ -778,7 +778,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, case ZSTD_c_forceMaxWindow : CCtxParams->forceWindow = (value != 0); - return CCtxParams->forceWindow; + return (size_t)CCtxParams->forceWindow; case ZSTD_c_forceAttachDict : { const ZSTD_dictAttachPref_e pref = (ZSTD_dictAttachPref_e)value; @@ -3063,7 +3063,7 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi unsigned* const countWksp = (unsigned*)workspace; const size_t countWkspSize = (HUF_SYMBOLVALUE_MAX + 1) * sizeof(unsigned); BYTE* const nodeWksp = countWkspStart + countWkspSize; - const size_t nodeWkspSize = wkspEnd-nodeWksp; + const size_t nodeWkspSize = (size_t)(wkspEnd - nodeWksp); unsigned maxSymbolValue = HUF_SYMBOLVALUE_MAX; unsigned huffLog = HUF_TABLELOG_DEFAULT; HUF_repeat repeat = prevHuf->repeatMode; diff --git a/lib/decompress/zstd_decompress_internal.h b/lib/decompress/zstd_decompress_internal.h index 2b5a53850..17c7df9d0 100644 --- a/lib/decompress/zstd_decompress_internal.h +++ b/lib/decompress/zstd_decompress_internal.h @@ -75,6 +75,7 @@ static UNUSED_ATTR const U32 ML_base[MaxML+1] = { #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE (sizeof(S16) * (MaxSeq + 1) + (1u << MaxFSELog) + sizeof(U64)) #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32 ((ZSTD_BUILD_FSE_TABLE_WKSP_SIZE + sizeof(U32) - 1) / sizeof(U32)) +#define HufLog 12 typedef struct { ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)]; /* Note : Space reserved for FSE Tables */ From 2d154e627a9961b728ee5943076c639b3942bbaa Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 21 Jan 2022 17:03:48 -0800 Subject: [PATCH 051/472] renamed HufLog into ZSTD_HUFFDTABLE_CAPACITY_LOG old name was not descriptive and actually misleading --- lib/decompress/zstd_ddict.c | 2 +- lib/decompress/zstd_decompress.c | 2 +- lib/decompress/zstd_decompress_internal.h | 4 ++-- lib/legacy/zstd_v05.c | 6 +++--- lib/legacy/zstd_v06.c | 6 +++--- lib/legacy/zstd_v07.c | 6 +++--- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/decompress/zstd_ddict.c b/lib/decompress/zstd_ddict.c index ce335477b..889764a5e 100644 --- a/lib/decompress/zstd_ddict.c +++ b/lib/decompress/zstd_ddict.c @@ -134,7 +134,7 @@ static size_t ZSTD_initDDict_internal(ZSTD_DDict* ddict, ZSTD_memcpy(internalBuffer, dict, dictSize); } ddict->dictSize = dictSize; - ddict->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */ + ddict->entropy.hufTable[0] = (HUF_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); /* cover both little and big endian */ /* parse dictionary content */ FORWARD_IF_ERROR( ZSTD_loadEntropy_intoDDict(ddict, dictContentType) , ""); diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index 0031e98cf..44649dd37 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -1453,7 +1453,7 @@ size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx) dctx->prefixStart = NULL; dctx->virtualStart = NULL; dctx->dictEnd = NULL; - dctx->entropy.hufTable[0] = (HUF_DTable)((HufLog)*0x1000001); /* cover both little and big endian */ + dctx->entropy.hufTable[0] = (HUF_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); /* cover both little and big endian */ dctx->litEntropy = dctx->fseEntropy = 0; dctx->dictID = 0; dctx->bType = bt_reserved; diff --git a/lib/decompress/zstd_decompress_internal.h b/lib/decompress/zstd_decompress_internal.h index 17c7df9d0..91e9dceb5 100644 --- a/lib/decompress/zstd_decompress_internal.h +++ b/lib/decompress/zstd_decompress_internal.h @@ -75,13 +75,13 @@ static UNUSED_ATTR const U32 ML_base[MaxML+1] = { #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE (sizeof(S16) * (MaxSeq + 1) + (1u << MaxFSELog) + sizeof(U64)) #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32 ((ZSTD_BUILD_FSE_TABLE_WKSP_SIZE + sizeof(U32) - 1) / sizeof(U32)) -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 typedef struct { ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)]; /* Note : Space reserved for FSE Tables */ ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)]; /* is also used as temporary workspace while building hufTable during DDict creation */ ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)]; /* and therefore must be at least HUF_DECOMPRESS_WORKSPACE_SIZE large */ - HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */ + HUF_DTable hufTable[HUF_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; /* can accommodate HUF_decompress4X */ U32 rep[ZSTD_REP_NUM]; U32 workspace[ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32]; } ZSTD_entropyDTables_t; diff --git a/lib/legacy/zstd_v05.c b/lib/legacy/zstd_v05.c index 795dfb410..fbed0a015 100644 --- a/lib/legacy/zstd_v05.c +++ b/lib/legacy/zstd_v05.c @@ -485,7 +485,7 @@ static const size_t ZSTDv05_frameHeaderSize_min = 5; #define FSEv05_ENCODING_DYNAMIC 3 -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */ @@ -2645,7 +2645,7 @@ struct ZSTDv05_DCtx_s FSEv05_DTable LLTable[FSEv05_DTABLE_SIZE_U32(LLFSEv05Log)]; FSEv05_DTable OffTable[FSEv05_DTABLE_SIZE_U32(OffFSEv05Log)]; FSEv05_DTable MLTable[FSEv05_DTABLE_SIZE_U32(MLFSEv05Log)]; - unsigned hufTableX4[HUFv05_DTABLE_SIZE(HufLog)]; + unsigned hufTableX4[HUFv05_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; const void* previousDstEnd; const void* base; const void* vBase; @@ -2673,7 +2673,7 @@ size_t ZSTDv05_decompressBegin(ZSTDv05_DCtx* dctx) dctx->base = NULL; dctx->vBase = NULL; dctx->dictEnd = NULL; - dctx->hufTableX4[0] = HufLog; + dctx->hufTableX4[0] = ZSTD_HUFFDTABLE_CAPACITY_LOG; dctx->flagStaticTables = 0; return 0; } diff --git a/lib/legacy/zstd_v06.c b/lib/legacy/zstd_v06.c index ead213c48..c486ed0ac 100644 --- a/lib/legacy/zstd_v06.c +++ b/lib/legacy/zstd_v06.c @@ -479,7 +479,7 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t; #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */ -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 #define IS_HUF 0 #define IS_PCH 1 @@ -2806,7 +2806,7 @@ struct ZSTDv06_DCtx_s FSEv06_DTable LLTable[FSEv06_DTABLE_SIZE_U32(LLFSELog)]; FSEv06_DTable OffTable[FSEv06_DTABLE_SIZE_U32(OffFSELog)]; FSEv06_DTable MLTable[FSEv06_DTABLE_SIZE_U32(MLFSELog)]; - unsigned hufTableX4[HUFv06_DTABLE_SIZE(HufLog)]; + unsigned hufTableX4[HUFv06_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; const void* previousDstEnd; const void* base; const void* vBase; @@ -2834,7 +2834,7 @@ size_t ZSTDv06_decompressBegin(ZSTDv06_DCtx* dctx) dctx->base = NULL; dctx->vBase = NULL; dctx->dictEnd = NULL; - dctx->hufTableX4[0] = HufLog; + dctx->hufTableX4[0] = ZSTD_HUFFDTABLE_CAPACITY_LOG; dctx->flagRepeatTable = 0; return 0; } diff --git a/lib/legacy/zstd_v07.c b/lib/legacy/zstd_v07.c index 3a0418e52..20d97da5d 100644 --- a/lib/legacy/zstd_v07.c +++ b/lib/legacy/zstd_v07.c @@ -2717,7 +2717,7 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t; #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */ -#define HufLog 12 +#define ZSTD_HUFFDTABLE_CAPACITY_LOG 12 typedef enum { lbt_huffman, lbt_repeat, lbt_raw, lbt_rle } litBlockType_t; #define LONGNBSEQ 0x7F00 @@ -2931,7 +2931,7 @@ struct ZSTDv07_DCtx_s FSEv07_DTable LLTable[FSEv07_DTABLE_SIZE_U32(LLFSELog)]; FSEv07_DTable OffTable[FSEv07_DTABLE_SIZE_U32(OffFSELog)]; FSEv07_DTable MLTable[FSEv07_DTABLE_SIZE_U32(MLFSELog)]; - HUFv07_DTable hufTable[HUFv07_DTABLE_SIZE(HufLog)]; /* can accommodate HUFv07_decompress4X */ + HUFv07_DTable hufTable[HUFv07_DTABLE_SIZE(ZSTD_HUFFDTABLE_CAPACITY_LOG)]; /* can accommodate HUFv07_decompress4X */ const void* previousDstEnd; const void* base; const void* vBase; @@ -2967,7 +2967,7 @@ size_t ZSTDv07_decompressBegin(ZSTDv07_DCtx* dctx) dctx->base = NULL; dctx->vBase = NULL; dctx->dictEnd = NULL; - dctx->hufTable[0] = (HUFv07_DTable)((HufLog)*0x1000001); + dctx->hufTable[0] = (HUFv07_DTable)((ZSTD_HUFFDTABLE_CAPACITY_LOG)*0x1000001); dctx->litEntropy = dctx->fseEntropy = 0; dctx->dictID = 0; { int i; for (i=0; irep[i] = repStartValue[i]; } From a66e8bb437203df68910f9d898dd9434bbf8f08a Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 21 Jan 2022 17:13:33 -0800 Subject: [PATCH 052/472] introduced LitHufLog constant which properly represents the maximum bit size of compressed literals (11) as defined in the specification. To be preferred from HUF_TABLELOG_DEFAULT which represents the same value but by accident. Name selected to keep the same convention as existing width definitions, MLFSELog, LLFSELog and OffFSELog. --- lib/common/zstd_internal.h | 7 ++++--- lib/compress/zstd_compress.c | 16 ++++++++-------- lib/compress/zstd_compress_literals.c | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/common/zstd_internal.h b/lib/common/zstd_internal.h index 0594b7fce..ff2c2cd44 100644 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@ -102,6 +102,7 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy #define MINMATCH 3 #define Litbits 8 +#define LitHufLog 11 #define MaxLit ((1<= 3) /* GCC Intrinsic */ - return __builtin_clz (val) ^ 31; + return (U32)__builtin_clz (val) ^ 31; # elif defined(__ICCARM__) /* IAR Intrinsic */ return 31 - __CLZ(val); # else /* Software version */ @@ -416,7 +417,7 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros(size_t val) } # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) - return __builtin_ctzll((U64)val); + return (unsigned)__builtin_ctzll((U64)val); # else static const int DeBruijnBytePos[64] = { 0, 1, 2, 7, 3, 13, 8, 19, 4, 25, 14, 28, 9, 34, 20, 56, @@ -439,7 +440,7 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros(size_t val) __assume(0); } # elif defined(__GNUC__) && (__GNUC__ >= 3) - return __builtin_ctz((U32)val); + return (unsigned)__builtin_ctz((U32)val); # else static const int DeBruijnBytePos[32] = { 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index e80d453e9..ed10d8555 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -840,7 +840,7 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, case ZSTD_c_enableDedicatedDictSearch : CCtxParams->enableDedicatedDictSearch = (value!=0); - return CCtxParams->enableDedicatedDictSearch; + return (size_t)CCtxParams->enableDedicatedDictSearch; case ZSTD_c_enableLongDistanceMatching : CCtxParams->ldmParams.enableLdm = (ZSTD_paramSwitch_e)value; @@ -849,38 +849,38 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, case ZSTD_c_ldmHashLog : if (value!=0) /* 0 ==> auto */ BOUNDCHECK(ZSTD_c_ldmHashLog, value); - CCtxParams->ldmParams.hashLog = value; + CCtxParams->ldmParams.hashLog = (U32)value; return CCtxParams->ldmParams.hashLog; case ZSTD_c_ldmMinMatch : if (value!=0) /* 0 ==> default */ BOUNDCHECK(ZSTD_c_ldmMinMatch, value); - CCtxParams->ldmParams.minMatchLength = value; + CCtxParams->ldmParams.minMatchLength = (U32)value; return CCtxParams->ldmParams.minMatchLength; case ZSTD_c_ldmBucketSizeLog : if (value!=0) /* 0 ==> default */ BOUNDCHECK(ZSTD_c_ldmBucketSizeLog, value); - CCtxParams->ldmParams.bucketSizeLog = value; + CCtxParams->ldmParams.bucketSizeLog = (U32)value; return CCtxParams->ldmParams.bucketSizeLog; case ZSTD_c_ldmHashRateLog : if (value!=0) /* 0 ==> default */ BOUNDCHECK(ZSTD_c_ldmHashRateLog, value); - CCtxParams->ldmParams.hashRateLog = value; + CCtxParams->ldmParams.hashRateLog = (U32)value; return CCtxParams->ldmParams.hashRateLog; case ZSTD_c_targetCBlockSize : if (value!=0) /* 0 ==> default */ BOUNDCHECK(ZSTD_c_targetCBlockSize, value); - CCtxParams->targetCBlockSize = value; + CCtxParams->targetCBlockSize = (U32)value; return CCtxParams->targetCBlockSize; case ZSTD_c_srcSizeHint : if (value!=0) /* 0 ==> default */ BOUNDCHECK(ZSTD_c_srcSizeHint, value); CCtxParams->srcSizeHint = value; - return CCtxParams->srcSizeHint; + return (size_t)CCtxParams->srcSizeHint; case ZSTD_c_stableInBuffer: BOUNDCHECK(ZSTD_c_stableInBuffer, value); @@ -3065,7 +3065,7 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi BYTE* const nodeWksp = countWkspStart + countWkspSize; const size_t nodeWkspSize = (size_t)(wkspEnd - nodeWksp); unsigned maxSymbolValue = HUF_SYMBOLVALUE_MAX; - unsigned huffLog = HUF_TABLELOG_DEFAULT; + unsigned huffLog = LitHufLog; HUF_repeat repeat = prevHuf->repeatMode; DEBUGLOG(5, "ZSTD_buildBlockEntropyStats_literals (srcSize=%zu)", srcSize); diff --git a/lib/compress/zstd_compress_literals.c b/lib/compress/zstd_compress_literals.c index d6d63278a..83f911648 100644 --- a/lib/compress/zstd_compress_literals.c +++ b/lib/compress/zstd_compress_literals.c @@ -132,7 +132,7 @@ size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf, huf_compress = singleStream ? HUF_compress1X_repeat : HUF_compress4X_repeat; cLitSize = huf_compress(ostart+lhSize, dstCapacity-lhSize, src, srcSize, - HUF_SYMBOLVALUE_MAX, HUF_TABLELOG_DEFAULT, + HUF_SYMBOLVALUE_MAX, LitHufLog, entropyWorkspace, entropyWorkspaceSize, (HUF_CElt*)nextHuf->CTable, &repeat, preferRepeat, From 8b46895588c6a199d6fa674752b51dd547f0addf Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 26 Jan 2022 15:22:06 -0800 Subject: [PATCH 053/472] removed new huffman depth heuristic results are now identical to before this PR --- lib/compress/huf_compress.c | 27 ++++----------------------- tests/regression/results.csv | 22 +++++++++++----------- 2 files changed, 15 insertions(+), 34 deletions(-) diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c index b533573d1..d1b98afdb 100644 --- a/lib/compress/huf_compress.c +++ b/lib/compress/huf_compress.c @@ -143,7 +143,10 @@ typedef struct { S16 norm[HUF_TABLELOG_MAX+1]; } HUF_CompressWeightsWksp; -static size_t HUF_compressWeights(void* dst, size_t dstSize, const void* weightTable, size_t wtSize, void* workspace, size_t workspaceSize) +static size_t +HUF_compressWeights(void* dst, size_t dstSize, + const void* weightTable, size_t wtSize, + void* workspace, size_t workspaceSize) { BYTE* const ostart = (BYTE*) dst; BYTE* op = ostart; @@ -731,18 +734,6 @@ static void HUF_buildCTableFromTree(HUF_CElt* CTable, nodeElt const* huffNode, i CTable[0] = maxNbBits; } -static size_t -HUF_nbSymbolsTooLarge(const nodeElt* hnodes, U32 maxSymbolValue, U32 maxNbBits) -{ - size_t nbSTL = 0; - int s = (int)maxSymbolValue; - for ( ; s > 0; s-- ) { - if (hnodes[s].nbBits > maxNbBits) nbSTL++; - else break; - } - return nbSTL; -} - size_t HUF_buildCTable_wksp(HUF_CElt* CTable, const unsigned* count, U32 maxSymbolValue, U32 maxNbBits, void* workSpace, size_t wkspSize) @@ -771,16 +762,6 @@ HUF_buildCTable_wksp(HUF_CElt* CTable, const unsigned* count, U32 maxSymbolValue nonNullRank = HUF_buildTree(huffNode, maxSymbolValue); /* determine and enforce maxTableLog */ - /* Loosen target when maxNbBits is already within limits. - * A harsh rebalancing can be bad for compression ratio - * while a mild one tends to be better */ - while (maxNbBits < HUF_TABLELOG_DEFAULT) { - size_t const nbSTL = HUF_nbSymbolsTooLarge(huffNode, maxSymbolValue, maxNbBits); - #define HUF_NB_NODES_TO_FIX_MAX 32 - if (nbSTL < HUF_NB_NODES_TO_FIX_MAX) /* heuristic */ - break; - maxNbBits++; - } maxNbBits = HUF_setMaxHeight(huffNode, (U32)nonNullRank, maxNbBits); if (maxNbBits > HUF_TABLELOG_MAX) return ERROR(GENERIC); /* check fit into table */ diff --git a/tests/regression/results.csv b/tests/regression/results.csv index f80da9f4e..3385c5049 100644 --- a/tests/regression/results.csv +++ b/tests/regression/results.csv @@ -51,7 +51,7 @@ silesia, long distance mode, compress silesia, multithreaded, compress cctx, 4842075 silesia, multithreaded long distance mode, compress cctx, 4842075 silesia, small window log, compress cctx, 7082951 -silesia, small hash log, compress cctx, 6525895 +silesia, small hash log, compress cctx, 6526141 silesia, small chain log, compress cctx, 4912197 silesia, explicit params, compress cctx, 4794052 silesia, uncompressed literals, compress cctx, 4842075 @@ -115,7 +115,7 @@ silesia, long distance mode, zstdcli, silesia, multithreaded, zstdcli, 4842123 silesia, multithreaded long distance mode, zstdcli, 4833785 silesia, small window log, zstdcli, 7095048 -silesia, small hash log, zstdcli, 6525943 +silesia, small hash log, zstdcli, 6526189 silesia, small chain log, zstdcli, 4912245 silesia, explicit params, zstdcli, 4795432 silesia, uncompressed literals, zstdcli, 5120614 @@ -141,7 +141,7 @@ silesia.tar, long distance mode, zstdcli, silesia.tar, multithreaded, zstdcli, 4854164 silesia.tar, multithreaded long distance mode, zstdcli, 4845745 silesia.tar, small window log, zstdcli, 7100701 -silesia.tar, small hash log, zstdcli, 6529041 +silesia.tar, small hash log, zstdcli, 6529289 silesia.tar, small chain log, zstdcli, 4917022 silesia.tar, explicit params, zstdcli, 4820713 silesia.tar, uncompressed literals, zstdcli, 5122571 @@ -255,7 +255,7 @@ silesia, long distance mode, advanced silesia, multithreaded, advanced one pass, 4842075 silesia, multithreaded long distance mode, advanced one pass, 4833737 silesia, small window log, advanced one pass, 7095000 -silesia, small hash log, advanced one pass, 6525895 +silesia, small hash log, advanced one pass, 6526141 silesia, small chain log, advanced one pass, 4912197 silesia, explicit params, advanced one pass, 4795432 silesia, uncompressed literals, advanced one pass, 5120566 @@ -289,7 +289,7 @@ silesia.tar, long distance mode, advanced silesia.tar, multithreaded, advanced one pass, 4854160 silesia.tar, multithreaded long distance mode, advanced one pass, 4845741 silesia.tar, small window log, advanced one pass, 7100655 -silesia.tar, small hash log, advanced one pass, 6528983 +silesia.tar, small hash log, advanced one pass, 6529231 silesia.tar, small chain log, advanced one pass, 4917041 silesia.tar, explicit params, advanced one pass, 4806855 silesia.tar, uncompressed literals, advanced one pass, 5122473 @@ -573,7 +573,7 @@ silesia, long distance mode, advanced silesia, multithreaded, advanced one pass small out, 4842075 silesia, multithreaded long distance mode, advanced one pass small out, 4833737 silesia, small window log, advanced one pass small out, 7095000 -silesia, small hash log, advanced one pass small out, 6525895 +silesia, small hash log, advanced one pass small out, 6526141 silesia, small chain log, advanced one pass small out, 4912197 silesia, explicit params, advanced one pass small out, 4795432 silesia, uncompressed literals, advanced one pass small out, 5120566 @@ -607,7 +607,7 @@ silesia.tar, long distance mode, advanced silesia.tar, multithreaded, advanced one pass small out, 4854160 silesia.tar, multithreaded long distance mode, advanced one pass small out, 4845741 silesia.tar, small window log, advanced one pass small out, 7100655 -silesia.tar, small hash log, advanced one pass small out, 6528983 +silesia.tar, small hash log, advanced one pass small out, 6529231 silesia.tar, small chain log, advanced one pass small out, 4917041 silesia.tar, explicit params, advanced one pass small out, 4806855 silesia.tar, uncompressed literals, advanced one pass small out, 5122473 @@ -891,7 +891,7 @@ silesia, long distance mode, advanced silesia, multithreaded, advanced streaming, 4842075 silesia, multithreaded long distance mode, advanced streaming, 4833737 silesia, small window log, advanced streaming, 7111103 -silesia, small hash log, advanced streaming, 6525895 +silesia, small hash log, advanced streaming, 6526141 silesia, small chain log, advanced streaming, 4912197 silesia, explicit params, advanced streaming, 4795452 silesia, uncompressed literals, advanced streaming, 5120566 @@ -925,7 +925,7 @@ silesia.tar, long distance mode, advanced silesia.tar, multithreaded, advanced streaming, 4854160 silesia.tar, multithreaded long distance mode, advanced streaming, 4845741 silesia.tar, small window log, advanced streaming, 7117559 -silesia.tar, small hash log, advanced streaming, 6528986 +silesia.tar, small hash log, advanced streaming, 6529234 silesia.tar, small chain log, advanced streaming, 4917021 silesia.tar, explicit params, advanced streaming, 4806873 silesia.tar, uncompressed literals, advanced streaming, 5127423 @@ -1303,7 +1303,7 @@ silesia, long distance mode, old stre silesia, multithreaded, old streaming advanced, 4842075 silesia, multithreaded long distance mode, old streaming advanced, 4842075 silesia, small window log, old streaming advanced, 7111103 -silesia, small hash log, old streaming advanced, 6525895 +silesia, small hash log, old streaming advanced, 6526141 silesia, small chain log, old streaming advanced, 4912197 silesia, explicit params, old streaming advanced, 4795452 silesia, uncompressed literals, old streaming advanced, 4842075 @@ -1329,7 +1329,7 @@ silesia.tar, long distance mode, old stre silesia.tar, multithreaded, old streaming advanced, 4859271 silesia.tar, multithreaded long distance mode, old streaming advanced, 4859271 silesia.tar, small window log, old streaming advanced, 7117562 -silesia.tar, small hash log, old streaming advanced, 6528986 +silesia.tar, small hash log, old streaming advanced, 6529234 silesia.tar, small chain log, old streaming advanced, 4917021 silesia.tar, explicit params, old streaming advanced, 4806873 silesia.tar, uncompressed literals, old streaming advanced, 4859271 From beb48722411b53f36387c5c88ba9a9c7671c5c12 Mon Sep 17 00:00:00 2001 From: brailovich <91924341+brailovich@users.noreply.github.com> Date: Wed, 26 Jan 2022 16:51:18 -0800 Subject: [PATCH 054/472] Update zstdcli.c --- programs/zstdcli.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 34d2fa6e0..a8fc0d048 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -1366,8 +1366,8 @@ int main(int argCount, const char* argv[]) was a number of empty directories. In this case stdin and stdout should not be used */ if (nbInputFileNames > 0 ){ - DISPLAYLEVEL(2, "please provide correct input file(s) or non-empty directories -- ignored \n"); - CLEAN_RETURN(2); + DISPLAYLEVEL(1, "please provide correct input file(s) or non-empty directories -- ignored \n"); + CLEAN_RETURN(0); } UTIL_refFilename(filenames, stdinmark); } From 5e7523385b98afce31747be2a0569089539ceb8e Mon Sep 17 00:00:00 2001 From: brailovich <91924341+brailovich@users.noreply.github.com> Date: Wed, 26 Jan 2022 16:53:11 -0800 Subject: [PATCH 055/472] Update playTests.sh --- tests/playTests.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/playTests.sh b/tests/playTests.sh index f19291a60..5a45247b3 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -390,6 +390,18 @@ println "\n===> recursive mode test " # combination of -r with empty list of input file zstd -c -r < tmp > tmp.zst +# combination of -r with empty folder +mkdir -p tmpEmptyDir +zstd -r tmpEmptyDir 2>tmplog2 +if [grep "aborting" tmplog2]; then + println "Should not abort on empty directory" + rm -rf tmplog2 + rm -rf tmpEmptyDir + die +fi +rm -rf tmplog2 +rm -rf tmpEmptyDir + println "\n===> file removal" zstd -f --rm tmp From e60eba58bf83979e92de487a87c0829a7bd60f92 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Wed, 26 Jan 2022 17:55:26 -0800 Subject: [PATCH 056/472] Print zlib/lz4/lzma library versions in verbose version output Knowing the version of zlib/lz4/lzma we're linking against is very useful for debugging issues with those libraries, so print it out in the verbosity 4 version output. Also print this information at the top of `playTests.sh`. --- programs/fileio.c | 34 ++++++++++++++++++++++++++++++++++ programs/fileio.h | 3 +++ programs/zstdcli.c | 5 +++++ tests/playTests.sh | 1 + 4 files changed, 43 insertions(+) diff --git a/programs/fileio.c b/programs/fileio.c index 2066096d2..64909b964 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -69,6 +69,40 @@ UTIL_time_t g_displayClock = UTIL_TIME_INITIALIZER; # include #endif +char const* FIO_zlibVersion(void) +{ +#if defined(ZSTD_GZCOMPRESS) || defined(ZSTD_GZDECOMPRESS) + return zlibVersion(); +#else + return "Unsupported"; +#endif +} + +char const* FIO_lz4Version(void) +{ +#if defined(ZSTD_LZ4COMPRESS) || defined(ZSTD_LZ4DECOMPRESS) + /* LZ4_versionString() added in v1.7.3 */ +# if LZ4_VERSION_NUMBER >= 10703 + return LZ4_versionString(); +# else +# define ZSTD_LZ4_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE +# define ZSTD_LZ4_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LZ4_VERSION) + return ZSTD_LZ4_VERSION_STRING; +# endif +#else + return "Unsupported"; +#endif +} + +char const* FIO_lzmaVersion(void) +{ +#if defined(ZSTD_LZMACOMPRESS) || defined(ZSTD_LZMADECOMPRESS) + return lzma_version_string(); +#else + return "Unsupported"; +#endif +} + /*-************************************* * Constants diff --git a/programs/fileio.h b/programs/fileio.h index 9d6ebb1ac..0920f7228 100644 --- a/programs/fileio.h +++ b/programs/fileio.h @@ -166,6 +166,9 @@ int FIO_checkFilenameCollisions(const char** filenameTable, unsigned nbFiles); /* custom crash signal handler */ void FIO_addAbortHandler(void); +char const* FIO_zlibVersion(void); +char const* FIO_lz4Version(void); +char const* FIO_lzmaVersion(void); #if defined (__cplusplus) diff --git a/programs/zstdcli.c b/programs/zstdcli.c index fd563e1c2..a187ffafd 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -637,6 +637,11 @@ static void printVersion(void) #endif DISPLAYOUT("\n"); if (g_displayLevel >= 4) { + /* library versions */ + DISPLAYOUT("zlib version %s\n", FIO_zlibVersion()); + DISPLAYOUT("lz4 version %s\n", FIO_lz4Version()); + DISPLAYOUT("lzma version %s\n", FIO_lzmaVersion()); + /* posix support */ #ifdef _POSIX_C_SOURCE DISPLAYOUT("_POSIX_C_SOURCE defined: %ldL\n", (long) _POSIX_C_SOURCE); diff --git a/tests/playTests.sh b/tests/playTests.sh index f19291a60..edf344f5b 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -183,6 +183,7 @@ else fi +zstd -vvV println "\n===> simple tests " From f2d9652ad82c5ead0665bea428215eaf027de933 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 26 Jan 2022 18:04:52 -0800 Subject: [PATCH 057/472] more usage of new error code stabilityCondition_notRespected as suggested by @terrelln --- lib/compress/zstd_compress.c | 4 ++-- tests/zstreamtest.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 6a34beea9..4a073cf10 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5558,13 +5558,13 @@ static size_t ZSTD_checkBufferStability(ZSTD_CCtx const* cctx, if (cctx->appliedParams.inBufferMode == ZSTD_bm_stable) { ZSTD_inBuffer const expect = cctx->expectedInBuffer; if (expect.src != input->src || expect.pos != input->pos) - RETURN_ERROR(srcBuffer_wrong, "ZSTD_c_stableInBuffer enabled but input differs!"); + RETURN_ERROR(stabilityCondition_notRespected, "ZSTD_c_stableInBuffer enabled but input differs!"); } (void)endOp; if (cctx->appliedParams.outBufferMode == ZSTD_bm_stable) { size_t const outBufferSize = output->size - output->pos; if (cctx->expectedOutBufferSize != outBufferSize) - RETURN_ERROR(dstBuffer_wrong, "ZSTD_c_stableOutBuffer enabled but output size differs!"); + RETURN_ERROR(stabilityCondition_notRespected, "ZSTD_c_stableOutBuffer enabled but output size differs!"); } return 0; } diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index dbe2b907a..20a05a75c 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -868,7 +868,7 @@ static int basicUnitTests(U32 seed, double compressibility) in.pos = 0; { size_t const ret = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end); CHECK(!ZSTD_isError(ret), "Must error"); - CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_srcBuffer_wrong), "Must be this error"); + CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_stabilityCondition_notRespected), "Must be this error"); } DISPLAYLEVEL(3, "OK \n"); @@ -963,7 +963,7 @@ static int basicUnitTests(U32 seed, double compressibility) in.pos = out.pos = 0; { size_t const ret = ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_continue); CHECK(!ZSTD_isError(ret), "Must have errored"); - CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_dstBuffer_wrong), "Must be this error"); + CHECK(!(ZSTD_getErrorCode(ret) == ZSTD_error_stabilityCondition_notRespected), "Must be this error"); } DISPLAYLEVEL(3, "OK \n"); From 501a353b9154e6885031fe14e2ded5760c97f854 Mon Sep 17 00:00:00 2001 From: brailovich <91924341+brailovich@users.noreply.github.com> Date: Wed, 26 Jan 2022 18:56:52 -0800 Subject: [PATCH 058/472] Update playTests.sh --- tests/playTests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/playTests.sh b/tests/playTests.sh index 5a45247b3..ba2874034 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -393,7 +393,7 @@ zstd -c -r < tmp > tmp.zst # combination of -r with empty folder mkdir -p tmpEmptyDir zstd -r tmpEmptyDir 2>tmplog2 -if [grep "aborting" tmplog2]; then +if [ grep "aborting" tmplog2 ]; then println "Should not abort on empty directory" rm -rf tmplog2 rm -rf tmpEmptyDir From 8df1257c3cd70341307b87bffccbb334a10db5a1 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 27 Jan 2022 05:13:45 -0800 Subject: [PATCH 059/472] fix issue 44108 credit to oss-fuzz In rare circumstances, the block-splitter might cut a block at the exact beginning of a repcode. In which case, since litlength=0, if the repcode expected 1+ literals in front, its signification changes. This scenario is controlled in ZSTD_seqStore_resolveOffCodes(), and the repcode is transformed into a raw offset when its new meaning is incorrect. In more complex scenarios, the previous block might be emitted as uncompressed after all, thus modifying the expected repcode history. In the case discovered by oss-fuzz, the first block is emitted as uncompressed, so the repcode history remains at default values: 1,4,8. But since the starting repcode is repcode3, and the literal length is == 0, its meaning is : = repcode1 - 1. Since repcode1==1, it results in an offset value of 0, which is invalid. So that's what the `assert()` was verifying : the result of the repcode translation should be a valid offset. But actually, it doesn't matter, because this result will then be compared to reality, and since it's an invalid offset, it will necessarily be discarded if incorrect, then the repcode will be replaced by a raw offset. So the `assert()` is not useful. Furthermore, it's incorrect, because it assumes this situation cannot happen, but it does, as described in above scenario. --- lib/compress/zstd_compress.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index ed10d8555..c222ed2c4 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -3443,8 +3443,11 @@ ZSTD_resolveRepcodeToRawOffset(const U32 rep[ZSTD_REP_NUM], const U32 offBase, c if (adjustedRepCode == ZSTD_REP_NUM) { /* litlength == 0 and offCode == 2 implies selection of first repcode - 1 * This is only valid if it results in a valid offset value, aka > 0. + * Note : it may happen that `rep[0]==1` in exceptional circumstances. + * In which case this function will return 0, which is an invalid offset. + * It's not an issue though, since this value will be + * compared and discarded within ZSTD_seqStore_resolveOffCodes(). */ - assert(rep[0] > 1); return rep[0] - 1; } return rep[adjustedRepCode]; From 9f37d1fede5a3be4b16c10194306b1baa8a084f4 Mon Sep 17 00:00:00 2001 From: brailovich <91924341+brailovich@users.noreply.github.com> Date: Thu, 27 Jan 2022 08:22:05 -0800 Subject: [PATCH 060/472] Update playTests.sh combination of -r with empty folder simplified to comply with sh compatibility tests --- tests/playTests.sh | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/tests/playTests.sh b/tests/playTests.sh index ba2874034..e0d802f6e 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -392,14 +392,7 @@ zstd -c -r < tmp > tmp.zst # combination of -r with empty folder mkdir -p tmpEmptyDir -zstd -r tmpEmptyDir 2>tmplog2 -if [ grep "aborting" tmplog2 ]; then - println "Should not abort on empty directory" - rm -rf tmplog2 - rm -rf tmpEmptyDir - die -fi -rm -rf tmplog2 +zstd -r tmpEmptyDir rm -rf tmpEmptyDir From 246982e782849d8646b2d5df6648319935669228 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Thu, 20 Jan 2022 22:41:47 -0800 Subject: [PATCH 061/472] [dibio] Fix assertion triggered by no inputs Passing 0 inputs to `DiB_shuffle()` caused an assertion failure where it should just return. A test is added in a later commit, with the initial introduction of the new testing framework. Fixes #3007. --- programs/dibio.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/programs/dibio.c b/programs/dibio.c index d19f95448..147d1e7bf 100644 --- a/programs/dibio.c +++ b/programs/dibio.c @@ -27,9 +27,9 @@ #include /* memset */ #include /* fprintf, fopen, ftello64 */ #include /* errno */ -#include #include "timefn.h" /* UTIL_time_t, UTIL_clockSpanMicro, UTIL_getTime */ +#include "../lib/common/debug.h" /* assert */ #include "../lib/common/mem.h" /* read */ #include "dibio.h" @@ -193,7 +193,8 @@ static U32 DiB_rand(U32* src) static void DiB_shuffle(const char** fileNamesTable, unsigned nbFiles) { U32 seed = 0xFD2FB528; unsigned i; - assert(nbFiles >= 1); + if (nbFiles == 0) + return; for (i = nbFiles - 1; i > 0; --i) { unsigned const j = DiB_rand(&seed) % (i + 1); const char* const tmp = fileNamesTable[j]; From 495dcb839ab6ab40c4156b99be16b010389f2214 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Thu, 20 Jan 2022 22:45:03 -0800 Subject: [PATCH 062/472] [zstdcli] Fix option detection for --auto-threads The option `--auto-threads` should still be accepted and parsed, even if `ZSTD_MULTITHREAD` is not defined. It doesn't mean anything, but we should still accept the option. Since we want scripts to be able to work generically. This bug was caught by tests I added to the new testing framework. --- programs/zstdcli.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/programs/zstdcli.c b/programs/zstdcli.c index fd563e1c2..53b47f874 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -802,9 +802,7 @@ int main(int argCount, const char* argv[]) separateFiles = 0, setRealTimePrio = 0, singleThread = 0, -#ifdef ZSTD_MULTITHREAD defaultLogicalCores = 0, -#endif showDefaultCParams = 0, ultra=0, contentSize=1; @@ -996,7 +994,6 @@ int main(int argCount, const char* argv[]) if (longCommandWArg(&argument, "--target-compressed-block-size=")) { targetCBlockSize = readSizeTFromChar(&argument); continue; } if (longCommandWArg(&argument, "--size-hint=")) { srcSizeHint = readSizeTFromChar(&argument); continue; } if (longCommandWArg(&argument, "--output-dir-flat")) { NEXT_FIELD(outDirName); continue; } -#ifdef ZSTD_MULTITHREAD if (longCommandWArg(&argument, "--auto-threads")) { const char* threadDefault = NULL; NEXT_FIELD(threadDefault); @@ -1004,7 +1001,6 @@ int main(int argCount, const char* argv[]) defaultLogicalCores = 1; continue; } -#endif #ifdef UTIL_HAS_MIRRORFILELIST if (longCommandWArg(&argument, "--output-dir-mirror")) { NEXT_FIELD(outMirroredDirName); continue; } #endif @@ -1220,7 +1216,7 @@ int main(int argCount, const char* argv[]) } } #else - (void)singleThread; (void)nbWorkers; + (void)singleThread; (void)nbWorkers; (void)defaultLogicalCores; #endif g_utilDisplayLevel = g_displayLevel; From f088c430e35d8b97d11aa38c5c78a72931ec7bad Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Thu, 20 Jan 2022 22:46:45 -0800 Subject: [PATCH 063/472] [datagen] Remove extra newline printed `datagen` was printing a `\n` even when it had no other output. Raise the output level for the final `\n` to the minimum output level used. This minor bug was caught by the new testing framework. --- tests/datagencli.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/datagencli.c b/tests/datagencli.c index ecc05f95f..7300fdb76 100644 --- a/tests/datagencli.c +++ b/tests/datagencli.c @@ -124,7 +124,7 @@ int main(int argc, const char** argv) DISPLAYLEVEL(3, "Seed = %u \n", (unsigned)seed); RDG_genStdout(size, (double)probaU32/100, litProba, seed); - DISPLAYLEVEL(1, "\n"); + DISPLAYLEVEL(3, "\n"); return 0; } From f3096ff6d1fcf87eeec876da13c06a97343ed6cf Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Tue, 18 Jan 2022 13:31:27 -0800 Subject: [PATCH 064/472] [test] Add new CLI testing platform Adds the new CLI testing platform that I'm proposing. See the added `README.md` for details. --- tests/cli-tests/.gitignore | 4 + tests/cli-tests/README.md | 248 +++++++ tests/cli-tests/basic/help.sh | 7 + tests/cli-tests/basic/help.sh.stdout.glob | 34 + tests/cli-tests/basic/version.sh | 3 + tests/cli-tests/basic/version.sh.stdout.glob | 2 + tests/cli-tests/bin/cmp_size | 46 ++ tests/cli-tests/bin/datagen | 3 + tests/cli-tests/bin/die | 4 + tests/cli-tests/bin/println | 2 + tests/cli-tests/bin/unzstd | 1 + tests/cli-tests/bin/zstd | 7 + tests/cli-tests/bin/zstdcat | 1 + tests/cli-tests/bin/zstdgrep | 2 + tests/cli-tests/common/format.sh | 19 + tests/cli-tests/common/mtime.sh | 13 + tests/cli-tests/common/permissions.sh | 18 + tests/cli-tests/common/platform.sh | 37 + tests/cli-tests/compression/adapt.sh | 6 + tests/cli-tests/compression/basic.sh | 28 + .../compression/compress-literals.sh | 10 + tests/cli-tests/compression/format.sh | 16 + tests/cli-tests/compression/levels.sh | 64 ++ .../compression/levels.sh.stderr.exact | 75 ++ .../compression/long-distance-matcher.sh | 7 + tests/cli-tests/compression/multi-threaded.sh | 11 + .../cli-tests/compression/row-match-finder.sh | 7 + tests/cli-tests/compression/setup | 7 + tests/cli-tests/compression/stream-size.sh | 7 + tests/cli-tests/dict-builder/no-inputs | 3 + tests/cli-tests/dict-builder/no-inputs.exit | 1 + .../dict-builder/no-inputs.stderr.exact | 5 + .../dictionaries/dictionary-mismatch.sh | 29 + .../dictionary-mismatch.sh.stderr.exact | 8 + tests/cli-tests/dictionaries/setup | 6 + tests/cli-tests/dictionaries/setup_once | 24 + tests/cli-tests/run.py | 687 ++++++++++++++++++ 37 files changed, 1452 insertions(+) create mode 100644 tests/cli-tests/.gitignore create mode 100644 tests/cli-tests/README.md create mode 100755 tests/cli-tests/basic/help.sh create mode 100644 tests/cli-tests/basic/help.sh.stdout.glob create mode 100755 tests/cli-tests/basic/version.sh create mode 100644 tests/cli-tests/basic/version.sh.stdout.glob create mode 100755 tests/cli-tests/bin/cmp_size create mode 100755 tests/cli-tests/bin/datagen create mode 100755 tests/cli-tests/bin/die create mode 100755 tests/cli-tests/bin/println create mode 120000 tests/cli-tests/bin/unzstd create mode 100755 tests/cli-tests/bin/zstd create mode 120000 tests/cli-tests/bin/zstdcat create mode 100755 tests/cli-tests/bin/zstdgrep create mode 100644 tests/cli-tests/common/format.sh create mode 100644 tests/cli-tests/common/mtime.sh create mode 100644 tests/cli-tests/common/permissions.sh create mode 100644 tests/cli-tests/common/platform.sh create mode 100755 tests/cli-tests/compression/adapt.sh create mode 100755 tests/cli-tests/compression/basic.sh create mode 100755 tests/cli-tests/compression/compress-literals.sh create mode 100755 tests/cli-tests/compression/format.sh create mode 100755 tests/cli-tests/compression/levels.sh create mode 100644 tests/cli-tests/compression/levels.sh.stderr.exact create mode 100755 tests/cli-tests/compression/long-distance-matcher.sh create mode 100755 tests/cli-tests/compression/multi-threaded.sh create mode 100755 tests/cli-tests/compression/row-match-finder.sh create mode 100755 tests/cli-tests/compression/setup create mode 100755 tests/cli-tests/compression/stream-size.sh create mode 100755 tests/cli-tests/dict-builder/no-inputs create mode 100644 tests/cli-tests/dict-builder/no-inputs.exit create mode 100644 tests/cli-tests/dict-builder/no-inputs.stderr.exact create mode 100755 tests/cli-tests/dictionaries/dictionary-mismatch.sh create mode 100644 tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact create mode 100755 tests/cli-tests/dictionaries/setup create mode 100755 tests/cli-tests/dictionaries/setup_once create mode 100755 tests/cli-tests/run.py diff --git a/tests/cli-tests/.gitignore b/tests/cli-tests/.gitignore new file mode 100644 index 000000000..4bb425b61 --- /dev/null +++ b/tests/cli-tests/.gitignore @@ -0,0 +1,4 @@ +scratch/ +!bin/ +!datagen +!zstdcat diff --git a/tests/cli-tests/README.md b/tests/cli-tests/README.md new file mode 100644 index 000000000..3098f466f --- /dev/null +++ b/tests/cli-tests/README.md @@ -0,0 +1,248 @@ +# CLI tests + +The CLI tests are focused on testing the zstd CLI. +They are intended to be simple tests that the CLI and arguments work as advertised. +They are not intended to test the library, only the code in `programs/`. +The library will get incidental coverage, but if you find yourself trying to trigger a specific condition in the library, this is the wrong tool. + +## Test runner usage + +The test runner `run.py` will run tests against the in-tree build of `zstd` and `datagen` by default. Which means that `zstd` and `datagen` must be built. + +The `zstd` binary used can be passed with `--zstd /path/to/zstd`. +Additionally, to run `zstd` through a tool like `valgrind` or `qemu`, set the `--exec-prefix 'valgrind -q'` flag. + +Similarly, the `--datagen`, and `--zstdgrep` flags can be set to specify +the paths to their respective binaries. However, these tools do not use +the `EXEC_PREFIX`. + +Each test executes in its own scratch directory under `scratch/test/name`. E.g. `scratch/basic/help.sh/`. Normally these directories are removed after the test executes. However, the `--preserve` flag will preserve these directories after execution, and save the tests exit code, stdout, and stderr in the scratch directory to `exit`, `stderr`, and `stdout` respectively. This can be useful for debugging/editing a test and updating the expected output. + +### Running all the tests + +By default the test runner `run.py` will run all the tests, and report the results. + +Examples: + +``` +./run.py +./run.py --preserve +./run.py --zstd ../../build/programs/zstd --datagen ../../build/tests/datagen +``` + +### Running specific tests + +A set of test names can be passed to the test runner `run.py` to only execute those tests. +This can be useful for writing or debugging a test, especially with `--preserve`. + +The test name can either be the path to the test file, or the test name, which is the path relative to the test directory. + +Examples: + +``` +./run.py basic/help.sh +./run.py --preserve basic/help.sh basic/version.sh +./run.py --preserve --verbose basic/help.sh +``` + +## Writing a test + +Test cases are arbitrary executables, and can be written in any language, but are generally shell scripts. +After the script executes, the exit code, stderr, and stdout are compared against the expectations. + +Each test is run in a clean directory that the test can use for intermediate files. This directory will be cleaned up at the end of the test, unless `--preserve` is passed to the test runner. Additionally, the `setup` script can prepare the directory before the test runs. + +### Calling zstd, utilities, and environment variables + +The `$PATH` for tests is prepended with the `bin/` sub-directory, which contains helper scripts for ease of testing. +The `zstd` binary will call the zstd binary specified by `run.py` with the correct `$EXEC_PREFIX`. +Similarly, `datagen`, `unzstd`, `zstdgrep`, `zstdcat`, etc, are provided. + +Helper utilities like `cmp_size`, `println`, and `die` are provided here too. See their scripts for details. + +Common shell script libraries are provided under `common/`, with helper variables and functions. They can be sourced with `source "$COMMON/library.sh`. + +Lastly, environment variables are provided for testing, which can be listed when calling `run.py` with `--verbose`. +They are generally used by the helper scripts in `bin/` to coordinate everything. + +### Basic test case + +When executing your `$TEST` executable, by default the exit code is expected to be `0`. However, you can provide an alterate expected exit code in a `$TEST.exit` file. + +When executing your `$TEST` exectuable, by default the expected stderr and stdout are empty. However, you can override the default by providing one of three files: + +* `$TEST.{stdout,stderr}.exact` +* `$TEST.{stdout,stderr}.glob` +* `$TEST.{stdout,stderr}.ignore` + +If you provide a `.exact` file, the output is expected to exactly match, byte-for-byte. + +If you provide a `.glob` file, the output is expected to match the expected file, where each line is interpreted as a glob syntax. Additionally, a line containing only `...` matches all lines until the next expected line matches. + +If you provide a `.ignore` file, the output is ignored. + +#### Passing examples + +All these examples pass. + +Exit 1, and change the expectation to be 1. + +``` +exit-1.sh +--- +#!/bin/sh +exit 1 +--- + +exit-1.sh.exit +--- +1 +--- +``` + +Check the stdout output exactly matches. + +``` +echo.sh +--- +#!/bin/sh +echo "hello world" +--- + +echo.sh.stdout.exact +--- +hello world +--- +``` + +Check the stderr output using a glob. + +``` +random.sh +--- +#!/bin/sh +head -c 10 < /dev/urandom | xxd >&2 +--- + +random.sh.stderr.glob +--- +00000000: * * * * * * +``` + +Multiple lines can be matched with ... + +``` +random-num-lines.sh +--- +#!/bin/sh +echo hello +seq 0 $RANDOM +echo world +--- + +random-num-lines.sh.stdout.glob +--- +hello +0 +... +world +--- +``` + +#### Failing examples + +Exit code is expected to be 0, but is 1. + +``` +exit-1.sh +--- +#!/bin/sh +exit 1 +--- +``` + +Stdout is expected to be empty, but isn't. + +``` +echo.sh +--- +#!/bin/sh +echo hello world +``` + +Stderr is expected to be hello but is world. + +``` +hello.sh +--- +#!/bin/sh +echo world >&2 +--- + +hello.sh.stderr.exact +--- +hello +--- +``` + +### Setup & teardown scripts + +Finally, test writing can be eased with setup and teardown scripts. +Each directory in the test directory is a test-suite consisting of all tests within that directory (but not sub-directories). +This test suite can come with 4 scripts to help test writing: + +* `setup_once` +* `teardown_once` +* `setup` +* `teardown` + +The `setup_once` and `teardown_once` are run once before and after all the tests in the suite respectively. +They operate in the scratch directory for the test suite, which is the parent directory of each scratch directory for each test case. +They can do work that is shared between tests to improve test efficiency. +For example, the `dictionaries/setup_once` script builds several dictionaries, for use in the `dictionaries` tests. + +The `setup` and `teardown` scripts run before and after each test case respectively, in the test case's scratch directory. +These scripts can do work that is shared between test cases to make tests more succinct. +For example, the `dictionaries/setup` script copies the dictionaries built by the `dictionaries/setup_once` script into the test's scratch directory, to make them easier to use, and make sure they aren't accidentally modified. + +#### Examples + +``` +basic/setup +--- +#!/bin/sh +# Create some files for testing with +datagen > file +datagen > file0 +datagen > file1 +--- + +basic/test.sh +--- +#!/bin/sh +zstd file file0 file1 +--- + +dictionaries/setup_once +--- +#!/bin/sh +set -e + +mkdir files/ dicts/ +for i in $(seq 10); do + datagen -g1000 > files/$i +done + +zstd --train -r files/ -o dicts/0 +--- + +dictionaries/setup +--- +#!/bin/sh + +# Runs in the test case's scratch directory. +# The test suite's scratch directory that +# `setup_once` operates in is the parent directory. +cp -r ../files ../dicts . +--- +``` diff --git a/tests/cli-tests/basic/help.sh b/tests/cli-tests/basic/help.sh new file mode 100755 index 000000000..c683b6a6a --- /dev/null +++ b/tests/cli-tests/basic/help.sh @@ -0,0 +1,7 @@ +#!/bin/sh -e +println "+ zstd -h" +zstd -h +println "+ zstd -H" +zstd -H +println "+ zstd --help" +zstd --help diff --git a/tests/cli-tests/basic/help.sh.stdout.glob b/tests/cli-tests/basic/help.sh.stdout.glob new file mode 100644 index 000000000..5b2f8e458 --- /dev/null +++ b/tests/cli-tests/basic/help.sh.stdout.glob @@ -0,0 +1,34 @@ ++ zstd -h +*** zstd command line interface *-bits v1.*.*, by Yann Collet *** +Usage : + zstd *args* *FILE(s)* *-o file* + +FILE : a filename + with no FILE, or when FILE is - , read standard input +Arguments : + -# : # compression level* + -d : decompression + -D DICT: use DICT as Dictionary for compression or decompression + -o file: result stored into `file` (only 1 output file) + -f : disable input and output checks. Allows overwriting existing files, + input from console, output to stdout, operating on links, + block devices, etc. +--rm : remove source file(s) after successful de/compression + -k : preserve source file(s) (default) + -h/-H : display help/long help and exit + +Advanced arguments : + -V : display Version number and exit +... ++ zstd -H +... +Arguments : +... +Advanced arguments : +... ++ zstd --help +... +Arguments : +... +Advanced arguments : +... diff --git a/tests/cli-tests/basic/version.sh b/tests/cli-tests/basic/version.sh new file mode 100755 index 000000000..d50de0f3c --- /dev/null +++ b/tests/cli-tests/basic/version.sh @@ -0,0 +1,3 @@ +#!/bin/sh -e +zstd -V +zstd --version diff --git a/tests/cli-tests/basic/version.sh.stdout.glob b/tests/cli-tests/basic/version.sh.stdout.glob new file mode 100644 index 000000000..54968fa41 --- /dev/null +++ b/tests/cli-tests/basic/version.sh.stdout.glob @@ -0,0 +1,2 @@ +*** zstd command line interface *-bits v1.*.*, by Yann Collet *** +*** zstd command line interface *-bits v1.*.*, by Yann Collet *** diff --git a/tests/cli-tests/bin/cmp_size b/tests/cli-tests/bin/cmp_size new file mode 100755 index 000000000..5afa1c590 --- /dev/null +++ b/tests/cli-tests/bin/cmp_size @@ -0,0 +1,46 @@ +#!/bin/sh + +# Small utility to + +set -e + +usage() +{ + printf "USAGE:\n\t$0 [-eq|-ne|-lt|-le|-gt|-ge] FILE1 FILE2\n" +} + +help() +{ + printf "Small utility to compare file sizes without printing them with set -x.\n\n" + usage +} + +case "$1" in + -h) help; exit 0 ;; + --help) help; exit 0 ;; +esac + +if ! test -f $2; then + printf "FILE1='%b' is not a file\n\n" "$2" + usage + exit 1 +fi + +if ! test -f $3; then + printf "FILE2='%b' is not a file\n\n" "$3" + usage + exit 1 +fi + + +size1=$(wc -c < $2) +size2=$(wc -c < $3) + +case "$1" in + -eq) [ "$size1" -eq "$size2" ] ;; + -ne) [ "$size1" -ne "$size2" ] ;; + -lt) [ "$size1" -lt "$size2" ] ;; + -le) [ "$size1" -le "$size2" ] ;; + -gt) [ "$size1" -gt "$size2" ] ;; + -ge) [ "$size1" -ge "$size2" ] ;; +esac diff --git a/tests/cli-tests/bin/datagen b/tests/cli-tests/bin/datagen new file mode 100755 index 000000000..8c60cbcc9 --- /dev/null +++ b/tests/cli-tests/bin/datagen @@ -0,0 +1,3 @@ +#!/bin/sh + +"$DATAGEN_BIN" $@ diff --git a/tests/cli-tests/bin/die b/tests/cli-tests/bin/die new file mode 100755 index 000000000..8633bc975 --- /dev/null +++ b/tests/cli-tests/bin/die @@ -0,0 +1,4 @@ +#!/bin/sh + +println "${*}" 1>&2 +exit 1 diff --git a/tests/cli-tests/bin/println b/tests/cli-tests/bin/println new file mode 100755 index 000000000..1da246047 --- /dev/null +++ b/tests/cli-tests/bin/println @@ -0,0 +1,2 @@ +#!/bin/env sh +printf '%b\n' "${*}" diff --git a/tests/cli-tests/bin/unzstd b/tests/cli-tests/bin/unzstd new file mode 120000 index 000000000..613f917fd --- /dev/null +++ b/tests/cli-tests/bin/unzstd @@ -0,0 +1 @@ +zstd \ No newline at end of file diff --git a/tests/cli-tests/bin/zstd b/tests/cli-tests/bin/zstd new file mode 100755 index 000000000..198fc6d2d --- /dev/null +++ b/tests/cli-tests/bin/zstd @@ -0,0 +1,7 @@ +#!/bin/sh + +if [ -z "$EXEC_PREFIX" ]; then + "$ZSTD_BIN" $@ +else + $EXEC_PREFIX "$ZSTD_BIN" $@ +fi diff --git a/tests/cli-tests/bin/zstdcat b/tests/cli-tests/bin/zstdcat new file mode 120000 index 000000000..613f917fd --- /dev/null +++ b/tests/cli-tests/bin/zstdcat @@ -0,0 +1 @@ +zstd \ No newline at end of file diff --git a/tests/cli-tests/bin/zstdgrep b/tests/cli-tests/bin/zstdgrep new file mode 100755 index 000000000..8821ebb5b --- /dev/null +++ b/tests/cli-tests/bin/zstdgrep @@ -0,0 +1,2 @@ +#!/bin/sh +"$ZSTDGREP_BIN" $@ diff --git a/tests/cli-tests/common/format.sh b/tests/cli-tests/common/format.sh new file mode 100644 index 000000000..20ff0f056 --- /dev/null +++ b/tests/cli-tests/common/format.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +source "$COMMON/platform.sh" + +zstd_supports_format() +{ + zstd -h | grep > $INTOVOID -- "--format=$1" +} + +format_extension() +{ + if [ "$1" = "zstd" ]; then + printf "zst" + elif [ "$1" = "gzip" ]; then + printf "gz" + else + printf "$1" + fi +} diff --git a/tests/cli-tests/common/mtime.sh b/tests/cli-tests/common/mtime.sh new file mode 100644 index 000000000..7ce931a96 --- /dev/null +++ b/tests/cli-tests/common/mtime.sh @@ -0,0 +1,13 @@ +source "$COMMON/platform.sh" + +MTIME="stat -c %Y" +case "$UNAME" in + Darwin | FreeBSD | OpenBSD | NetBSD) MTIME="stat -f %m" ;; +esac + +assertSameMTime() { + MT1=$($MTIME "$1") + MT2=$($MTIME "$2") + echo MTIME $MT1 $MT2 + [ "$MT1" = "$MT2" ] || die "mtime on $1 doesn't match mtime on $2 ($MT1 != $MT2)" +} diff --git a/tests/cli-tests/common/permissions.sh b/tests/cli-tests/common/permissions.sh new file mode 100644 index 000000000..b1f6ea3ba --- /dev/null +++ b/tests/cli-tests/common/permissions.sh @@ -0,0 +1,18 @@ +source "$COMMON/platform.sh" + +GET_PERMS="stat -c %a" +case "$UNAME" in + Darwin | FreeBSD | OpenBSD | NetBSD) GET_PERMS="stat -f %Lp" ;; +esac + +assertFilePermissions() { + STAT1=$($GET_PERMS "$1") + STAT2=$2 + [ "$STAT1" = "$STAT2" ] || die "permissions on $1 don't match expected ($STAT1 != $STAT2)" +} + +assertSamePermissions() { + STAT1=$($GET_PERMS "$1") + STAT2=$($GET_PERMS "$2") + [ "$STAT1" = "$STAT2" ] || die "permissions on $1 don't match those on $2 ($STAT1 != $STAT2)" +} diff --git a/tests/cli-tests/common/platform.sh b/tests/cli-tests/common/platform.sh new file mode 100644 index 000000000..6eb45eab9 --- /dev/null +++ b/tests/cli-tests/common/platform.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +UNAME=$(uname) + +isWindows=false +INTOVOID="/dev/null" +case "$UNAME" in + GNU) DEVDEVICE="/dev/random" ;; + *) DEVDEVICE="/dev/zero" ;; +esac +case "$OS" in + Windows*) + isWindows=true + INTOVOID="NUL" + DEVDEVICE="NUL" + ;; +esac + +case "$UNAME" in + Darwin) MD5SUM="md5 -r" ;; + FreeBSD) MD5SUM="gmd5sum" ;; + NetBSD) MD5SUM="md5 -n" ;; + OpenBSD) MD5SUM="md5" ;; + *) MD5SUM="md5sum" ;; +esac + +DIFF="diff" +case "$UNAME" in + SunOS) DIFF="gdiff" ;; +esac + +if echo hello | zstd -v -T2 2>&1 > $INTOVOID | grep -q 'multi-threading is disabled' +then + hasMT="" +else + hasMT="true" +fi diff --git a/tests/cli-tests/compression/adapt.sh b/tests/cli-tests/compression/adapt.sh new file mode 100755 index 000000000..564e955b5 --- /dev/null +++ b/tests/cli-tests/compression/adapt.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +# Test --adapt +zstd -f file --adapt -c | zstd -t diff --git a/tests/cli-tests/compression/basic.sh b/tests/cli-tests/compression/basic.sh new file mode 100755 index 000000000..6f0f87932 --- /dev/null +++ b/tests/cli-tests/compression/basic.sh @@ -0,0 +1,28 @@ +#!/bin/sh -e + +# Uncomment the set -x line for debugging +# set -x + +# Test compression flags and check that they work +zstd file ; zstd -t file.zst +zstd -f file ; zstd -t file.zst +zstd -f -z file ; zstd -t file.zst +zstd -f -k file ; zstd -t file.zst +zstd -f -C file ; zstd -t file.zst +zstd -f --check file ; zstd -t file.zst +zstd -f --no-check file ; zstd -t file.zst +zstd -f -- file ; zstd -t file.zst + +# Test output file compression +zstd -o file-out.zst ; zstd -t file-out.zst +zstd -fo file-out.zst; zstd -t file-out.zst + +# Test compression to stdout +zstd -c file | zstd -t +zstd --stdout file | zstd -t +println bob | zstd | zstd -t + +# Test --rm +cp file file-rm +zstd --rm file-rm; zstd -t file-rm.zst +test ! -f file-rm diff --git a/tests/cli-tests/compression/compress-literals.sh b/tests/cli-tests/compression/compress-literals.sh new file mode 100755 index 000000000..573481a3f --- /dev/null +++ b/tests/cli-tests/compression/compress-literals.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -e + +# Test --[no-]compress-literals +zstd file --no-compress-literals -1 -c | zstd -t +zstd file --no-compress-literals -19 -c | zstd -t +zstd file --no-compress-literals --fast=1 -c | zstd -t +zstd file --compress-literals -1 -c | zstd -t +zstd file --compress-literals --fast=1 -c | zstd -t diff --git a/tests/cli-tests/compression/format.sh b/tests/cli-tests/compression/format.sh new file mode 100755 index 000000000..86fb40080 --- /dev/null +++ b/tests/cli-tests/compression/format.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +source "$COMMON/format.sh" + +set -e + +# Test --format +zstd --format=zstd file -f +zstd -t file.zst +for format in "gzip" "lz4" "xz" "lzma"; do + if zstd_supports_format $format; then + zstd --format=$format file + zstd -t file.$(format_extension $format) + zstd -c --format=$format file | zstd -t --format=$format + fi +done diff --git a/tests/cli-tests/compression/levels.sh b/tests/cli-tests/compression/levels.sh new file mode 100755 index 000000000..6bd0aca00 --- /dev/null +++ b/tests/cli-tests/compression/levels.sh @@ -0,0 +1,64 @@ +#!/bin/sh + +set -e +set -x + +datagen > file + +# Compress with various levels and ensure that their sizes are ordered +zstd --fast=10 file -o file-f10.zst +zstd --fast=1 file -o file-f1.zst +zstd -1 file -o file-1.zst +zstd -19 file -o file-19.zst +zstd -22 --ultra file -o file-22.zst + +zstd -t file-{f10,f1,1,19,22}.zst + +cmp_size -ne file-19.zst file-22.zst +cmp_size -lt file-19.zst file-1.zst +cmp_size -lt file-1.zst file-f1.zst +cmp_size -lt file-f1.zst file-f10.zst + +# Test default levels +zstd --fast file -f +cmp file.zst file-f1.zst || die "--fast is not level -1" + +zstd -0 file -o file-0.zst +zstd -f file +cmp file.zst file-0.zst || die "Level 0 is not the default level" + +# Test level clamping +zstd -99 file -o file-99.zst +cmp file-19.zst file-99.zst || die "Level 99 is clamped to 19" +zstd --fast=200000 file -c | zstd -t + +zstd -5000000000 -f file && die "Level too large, must fail" ||: +zstd --fast=5000000000 -f file && die "Level too large, must fail" ||: + +# Test setting a level through the environment variable +ZSTD_CLEVEL=-10 zstd file -o file-f10-env.zst +ZSTD_CLEVEL=1 zstd file -o file-1-env.zst +ZSTD_CLEVEL=+19 zstd file -o file-19-env.zst +ZSTD_CLEVEL=+99 zstd file -o file-99-env.zst + +cmp file-f10{,-env}.zst || die "Environment variable failed to set level" +cmp file-1{,-env}.zst || die "Environment variable failed to set level" +cmp file-19{,-env}.zst || die "Environment variable failed to set level" +cmp file-99{,-env}.zst || die "Environment variable failed to set level" + +# Test invalid environment clevel is the default level +zstd -f file +ZSTD_CLEVEL=- zstd -f file -o file-env.zst ; cmp file.zst file-env.zst +ZSTD_CLEVEL=+ zstd -f file -o file-env.zst ; cmp file.zst file-env.zst +ZSTD_CLEVEL=a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst +ZSTD_CLEVEL=-a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst +ZSTD_CLEVEL=+a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst +ZSTD_CLEVEL=3a7 zstd -f file -o file-env.zst ; cmp file.zst file-env.zst +ZSTD_CLEVEL=5000000000 zstd -f file -o file-env.zst; cmp file.zst file-env.zst + +# Test environment clevel is overridden by command line +ZSTD_CLEVEL=10 zstd -f file -1 -o file-1-env.zst +ZSTD_CLEVEL=10 zstd -f file --fast=1 -o file-f1-env.zst + +cmp file-1{,-env}.zst || die "Environment variable not overridden" +cmp file-f1{,-env}.zst || die "Environment variable not overridden" diff --git a/tests/cli-tests/compression/levels.sh.stderr.exact b/tests/cli-tests/compression/levels.sh.stderr.exact new file mode 100644 index 000000000..c0b7066fc --- /dev/null +++ b/tests/cli-tests/compression/levels.sh.stderr.exact @@ -0,0 +1,75 @@ ++ datagen ++ zstd --fast=10 file -o file-f10.zst ++ zstd --fast=1 file -o file-f1.zst ++ zstd -1 file -o file-1.zst ++ zstd -19 file -o file-19.zst ++ zstd -22 --ultra file -o file-22.zst ++ zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst file-22.zst ++ cmp_size -ne file-19.zst file-22.zst ++ cmp_size -lt file-19.zst file-1.zst ++ cmp_size -lt file-1.zst file-f1.zst ++ cmp_size -lt file-f1.zst file-f10.zst ++ zstd --fast file -f ++ cmp file.zst file-f1.zst ++ zstd -0 file -o file-0.zst ++ zstd -f file ++ cmp file.zst file-0.zst ++ zstd -99 file -o file-99.zst +Warning : compression level higher than max, reduced to 19 ++ cmp file-19.zst file-99.zst ++ zstd --fast=200000 file -c ++ zstd -t ++ zstd -5000000000 -f file +error: numeric value overflows 32-bit unsigned int ++ : ++ zstd --fast=5000000000 -f file +error: numeric value overflows 32-bit unsigned int ++ : ++ ZSTD_CLEVEL=-10 ++ zstd file -o file-f10-env.zst ++ ZSTD_CLEVEL=1 ++ zstd file -o file-1-env.zst ++ ZSTD_CLEVEL=+19 ++ zstd file -o file-19-env.zst ++ ZSTD_CLEVEL=+99 ++ zstd file -o file-99-env.zst +Warning : compression level higher than max, reduced to 19 ++ cmp file-f10.zst file-f10-env.zst ++ cmp file-1.zst file-1-env.zst ++ cmp file-19.zst file-19-env.zst ++ cmp file-99.zst file-99-env.zst ++ zstd -f file ++ ZSTD_CLEVEL=- ++ zstd -f file -o file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=-: not a valid integer value ++ cmp file.zst file-env.zst ++ ZSTD_CLEVEL=+ ++ zstd -f file -o file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=+: not a valid integer value ++ cmp file.zst file-env.zst ++ ZSTD_CLEVEL=a ++ zstd -f file -o file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=a: not a valid integer value ++ cmp file.zst file-env.zst ++ ZSTD_CLEVEL=-a ++ zstd -f file -o file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=-a: not a valid integer value ++ cmp file.zst file-env.zst ++ ZSTD_CLEVEL=+a ++ zstd -f file -o file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=+a: not a valid integer value ++ cmp file.zst file-env.zst ++ ZSTD_CLEVEL=3a7 ++ zstd -f file -o file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=3a7: not a valid integer value ++ cmp file.zst file-env.zst ++ ZSTD_CLEVEL=5000000000 ++ zstd -f file -o file-env.zst +Ignore environment variable setting ZSTD_CLEVEL=5000000000: numeric value too large ++ cmp file.zst file-env.zst ++ ZSTD_CLEVEL=10 ++ zstd -f file -1 -o file-1-env.zst ++ ZSTD_CLEVEL=10 ++ zstd -f file --fast=1 -o file-f1-env.zst ++ cmp file-1.zst file-1-env.zst ++ cmp file-f1.zst file-f1-env.zst diff --git a/tests/cli-tests/compression/long-distance-matcher.sh b/tests/cli-tests/compression/long-distance-matcher.sh new file mode 100755 index 000000000..8f2c61bf7 --- /dev/null +++ b/tests/cli-tests/compression/long-distance-matcher.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +# Test --long +zstd -f file --long ; zstd -t file.zst +zstd -f file --long=20; zstd -t file.zst diff --git a/tests/cli-tests/compression/multi-threaded.sh b/tests/cli-tests/compression/multi-threaded.sh new file mode 100755 index 000000000..e3961330a --- /dev/null +++ b/tests/cli-tests/compression/multi-threaded.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +# Test multi-threaded flags +zstd --single-thread file -f ; zstd -t file.zst +zstd -T2 -f file ; zstd -t file.zst +zstd --rsyncable -f file ; zstd -t file.zst +zstd -T0 -f file ; zstd -t file.zst +zstd -T0 --auto-threads=logical -f file ; zstd -t file.zst +zstd -T0 --auto-threads=physical -f file; zstd -t file.zst diff --git a/tests/cli-tests/compression/row-match-finder.sh b/tests/cli-tests/compression/row-match-finder.sh new file mode 100755 index 000000000..5b36017a0 --- /dev/null +++ b/tests/cli-tests/compression/row-match-finder.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +# Test --[no-]row-match-finder +zstd file -7f --row-match-finder +zstd file -7f --no-row-match-finder diff --git a/tests/cli-tests/compression/setup b/tests/cli-tests/compression/setup new file mode 100755 index 000000000..96e2309b6 --- /dev/null +++ b/tests/cli-tests/compression/setup @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +datagen > file +datagen > file0 +datagen > file1 diff --git a/tests/cli-tests/compression/stream-size.sh b/tests/cli-tests/compression/stream-size.sh new file mode 100755 index 000000000..7344769a2 --- /dev/null +++ b/tests/cli-tests/compression/stream-size.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +# Test stream size & hint +datagen -g7654 | zstd --stream-size=7654 | zstd -t +datagen -g7654 | zstd --size-hint=7000 | zstd -t diff --git a/tests/cli-tests/dict-builder/no-inputs b/tests/cli-tests/dict-builder/no-inputs new file mode 100755 index 000000000..d37fdce5a --- /dev/null +++ b/tests/cli-tests/dict-builder/no-inputs @@ -0,0 +1,3 @@ +#!/bin/sh +set -x +zstd --train diff --git a/tests/cli-tests/dict-builder/no-inputs.exit b/tests/cli-tests/dict-builder/no-inputs.exit new file mode 100644 index 000000000..8351c1939 --- /dev/null +++ b/tests/cli-tests/dict-builder/no-inputs.exit @@ -0,0 +1 @@ +14 diff --git a/tests/cli-tests/dict-builder/no-inputs.stderr.exact b/tests/cli-tests/dict-builder/no-inputs.stderr.exact new file mode 100644 index 000000000..b3b5599d5 --- /dev/null +++ b/tests/cli-tests/dict-builder/no-inputs.stderr.exact @@ -0,0 +1,5 @@ ++ zstd --train +! Warning : nb of samples too low for proper processing ! +! Please provide _one file per sample_. +! Alternatively, split files into fixed-size blocks representative of samples, with -B# +Error 14 : nb of samples too low diff --git a/tests/cli-tests/dictionaries/dictionary-mismatch.sh b/tests/cli-tests/dictionaries/dictionary-mismatch.sh new file mode 100755 index 000000000..2b5d5a0d2 --- /dev/null +++ b/tests/cli-tests/dictionaries/dictionary-mismatch.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +source "$COMMON/platform.sh" + +set -e + +if [ false ]; then + for seed in $(seq 100); do + datagen -g1000 -s$seed > file$seed + done + + zstd --train -r . -o dict0 -qq + + for seed in $(seq 101 200); do + datagen -g1000 -s$seed > file$seed + done + + zstd --train -r . -o dict1 -qq + + [ "$($MD5SUM < dict0)" != "$($MD5SUM < dict1)" ] || die "dictionaries must not match" + + datagen -g1000 -s0 > file0 +fi + +set -x +zstd files/0 -D dicts/0 +zstd -t files/0.zst -D dicts/0 +zstd -t files/0.zst -D dicts/1 && die "Must fail" ||: +zstd -t files/0.zst && die "Must fail" ||: diff --git a/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact b/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact new file mode 100644 index 000000000..399a3207d --- /dev/null +++ b/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact @@ -0,0 +1,8 @@ ++ zstd files/0 -D dicts/0 ++ zstd -t files/0.zst -D dicts/0 ++ zstd -t files/0.zst -D dicts/1 +files/0.zst : Decoding error (36) : Dictionary mismatch ++ : ++ zstd -t files/0.zst +files/0.zst : Decoding error (36) : Dictionary mismatch ++ : diff --git a/tests/cli-tests/dictionaries/setup b/tests/cli-tests/dictionaries/setup new file mode 100755 index 000000000..616c73eb8 --- /dev/null +++ b/tests/cli-tests/dictionaries/setup @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +cp -r ../files . +cp -r ../dicts . diff --git a/tests/cli-tests/dictionaries/setup_once b/tests/cli-tests/dictionaries/setup_once new file mode 100755 index 000000000..6316df165 --- /dev/null +++ b/tests/cli-tests/dictionaries/setup_once @@ -0,0 +1,24 @@ +#!/bin/sh + +set -e + +source "$COMMON/platform.sh" + + +mkdir files/ dicts/ + +for seed in $(seq 50); do + datagen -g1000 -s$seed > files/$seed +done + +zstd --train -r files -o dicts/0 -qq + +for seed in $(seq 51 100); do + datagen -g1000 -s$seed > files/$seed +done + +zstd --train -r files -o dicts/1 -qq + +cmp dicts/0 dicts/1 && die "dictionaries must not match!" + +datagen -g1000 > files/0 diff --git a/tests/cli-tests/run.py b/tests/cli-tests/run.py new file mode 100755 index 000000000..6791918a5 --- /dev/null +++ b/tests/cli-tests/run.py @@ -0,0 +1,687 @@ +#!/usr/bin/env python3 +# ################################################################ +# Copyright (c) Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under both the BSD-style license (found in the +# LICENSE file in the root directory of this source tree) and the GPLv2 (found +# in the COPYING file in the root directory of this source tree). +# You may select, at your option, one of the above-listed licenses. +# ########################################################################## + +import argparse +import contextlib +import copy +import fnmatch +import os +import shutil +import subprocess +import sys +import tempfile +import typing + + +EXCLUDED_DIRS = { + "bin", + "common", + "scratch", +} + + +EXCLUDED_BASENAMES = { + "setup", + "setup_once", + "teardown", + "teardown_once", + "README.md", + "run.py", + ".gitignore", +} + +EXCLUDED_SUFFIXES = [ + ".exact", + ".glob", + ".ignore", + ".exit", +] + + +def exclude_dir(dirname: str) -> bool: + """ + Should files under the directory :dirname: be excluded from the test runner? + """ + if dirname in EXCLUDED_DIRS: + return True + return False + + +def exclude_file(filename: str) -> bool: + """Should the file :filename: be excluded from the test runner?""" + if filename in EXCLUDED_BASENAMES: + return True + for suffix in EXCLUDED_SUFFIXES: + if filename.endswith(suffix): + return True + return False + +def read_file(filename: str) -> bytes: + """Reads the file :filename: and returns the contents as bytes.""" + with open(filename, "rb") as f: + return f.read() + + +def diff(a: bytes, b: bytes) -> str: + """Returns a diff between two different byte-strings :a: and :b:.""" + assert a != b + with tempfile.NamedTemporaryFile("wb") as fa: + fa.write(a) + fa.flush() + with tempfile.NamedTemporaryFile("wb") as fb: + fb.write(b) + fb.flush() + + diff_bytes = subprocess.run(["diff", fa.name, fb.name], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL).stdout + return diff_bytes.decode("utf8") + + +def pop_line(data: bytes) -> typing.Tuple[typing.Optional[bytes], bytes]: + """ + Pop the first line from :data: and returns the first line and the remainder + of the data as a tuple. If :data: is empty, returns :(None, data):. Otherwise + the first line always ends in a :\n:, even if it is the last line and :data: + doesn't end in :\n:. + """ + NEWLINE = b"\n"[0] + + if data == b'': + return (None, data) + + newline_idx = data.find(b"\n") + if newline_idx == -1: + end_idx = len(data) + else: + end_idx = newline_idx + 1 + + line = data[:end_idx] + data = data[end_idx:] + + assert len(line) != 0 + if line[-1] != NEWLINE: + line += NEWLINE + + return (line, data) + + +def glob_line_matches(actual: bytes, expect: bytes) -> bool: + """ + Does the `actual` line match the expected glob line `expect`? + """ + return fnmatch.fnmatchcase(actual.strip(), expect.strip()) + + +def glob_diff(actual: bytes, expect: bytes) -> bytes: + """ + Returns None if the :actual: content matches the expected glob :expect:, + otherwise returns the diff bytes. + """ + diff = b'' + actual_line, actual = pop_line(actual) + expect_line, expect = pop_line(expect) + while True: + # Handle end of file conditions - allow extra newlines + while expect_line is None and actual_line == b"\n": + actual_line, actual = pop_line(actual) + while actual_line is None and expect_line == b"\n": + expect_line, expect = pop_line(expect) + + if expect_line is None and actual_line is None: + if diff == b'': + return None + return diff + elif expect_line is None: + diff += b"---\n" + while actual_line != None: + diff += b"> " + diff += actual_line + actual_line, actual = pop_line(actual) + return diff + elif actual_line is None: + diff += b"---\n" + while expect_line != None: + diff += b"< " + diff += expect_line + expect_line, expect = pop_line(expect) + return diff + + assert expect_line is not None + assert actual_line is not None + + if expect_line == b'...\n': + next_expect_line, expect = pop_line(expect) + if next_expect_line is None: + if diff == b'': + return None + return diff + while not glob_line_matches(actual_line, next_expect_line): + actual_line, actual = pop_line(actual) + if actual_line is None: + diff += b"---\n" + diff += b"< " + diff += next_expect_line + return diff + expect_line = next_expect_line + continue + + if not glob_line_matches(actual_line, expect_line): + diff += b'---\n' + diff += b'< ' + expect_line + diff += b'> ' + actual_line + + actual_line, actual = pop_line(actual) + expect_line, expect = pop_line(expect) + + +class Options: + """Options configuring how to run a :TestCase:.""" + def __init__( + self, + env: typing.Dict[str, str], + timeout: typing.Optional[int], + verbose: bool, + preserve: bool, + scratch_dir: str, + test_dir: str, + ) -> None: + self.env = env + self.timeout = timeout + self.verbose = verbose + self.preserve = preserve + self.scratch_dir = scratch_dir + self.test_dir = test_dir + + +class TestCase: + """ + Logic and state related to running a single test case. + + 1. Initialize the test case. + 2. Launch the test case with :TestCase.launch():. + This will start the test execution in a subprocess, but + not wait for completion. So you could launch multiple test + cases in parallel. This will now print any test output. + 3. Analyze the results with :TestCase.analyze():. This will + join the test subprocess, check the results against the + expectations, and print the results to stdout. + + :TestCase.run(): is also provided which combines the launch & analyze + steps for single-threaded use-cases. + + All other methods, prefixed with _, are private helper functions. + """ + def __init__(self, test_filename: str, options: Options) -> None: + """ + Initialize the :TestCase: for the test located in :test_filename: + with the given :options:. + """ + self._opts = options + self._test_file = test_filename + self._test_name = os.path.normpath( + os.path.relpath(test_filename, start=self._opts.test_dir) + ) + self._success = {} + self._message = {} + self._test_stdin = None + self._scratch_dir = os.path.abspath(os.path.join(self._opts.scratch_dir, self._test_name)) + + @property + def name(self) -> str: + """Returns the unique name for the test.""" + return self._test_name + + def launch(self) -> None: + """ + Launch the test case as a subprocess, but do not block on completion. + This allows users to run multiple tests in parallel. Results aren't yet + printed out. + """ + self._launch_test() + + def analyze(self) -> bool: + """ + Must be called after :TestCase.launch():. Joins the test subprocess and + checks the results against expectations. Finally prints the results to + stdout and returns the success. + """ + self._join_test() + self._check_exit() + self._check_stderr() + self._check_stdout() + self._analyze_results() + return self._succeeded + + def run(self) -> bool: + """Shorthand for combining both :TestCase.launch(): and :TestCase.analyze():.""" + self.launch() + return self.analyze() + + def _log(self, *args, **kwargs) -> None: + """Logs test output.""" + print(file=sys.stdout, *args, **kwargs) + + def _vlog(self, *args, **kwargs) -> None: + """Logs verbose test output.""" + if self._opts.verbose: + print(file=sys.stdout, *args, **kwargs) + + def _test_environment(self) -> typing.Dict[str, str]: + """ + Returns the environment to be used for the + test subprocess. + """ + env = copy.copy(os.environ) + for k, v in self._opts.env.items(): + self._vlog(f"${k}='{v}'") + env[k] = v + + def _launch_test(self) -> None: + """Launch the test subprocess, but do not join it.""" + args = [os.path.abspath(self._test_file)] + stdin_name = f"{self._test_file}.stdin" + if os.path.exists(stdin_name): + self._test_stdin = open(stdin_name, "rb") + stdin = self._test_stdin + else: + stdin = subprocess.DEVNULL + cwd = self._scratch_dir + env = self._test_environment() + self._test_process = subprocess.Popen( + args=args, + stdin=stdin, + cwd=cwd, + env=env, + stderr=subprocess.PIPE, + stdout=subprocess.PIPE + ) + + def _join_test(self) -> None: + """Join the test process and save stderr, stdout, and the exit code.""" + (stdout, stderr) = self._test_process.communicate(timeout=self._opts.timeout) + self._output = {} + self._output["stdout"] = stdout + self._output["stderr"] = stderr + self._exit_code = self._test_process.returncode + self._test_process = None + if self._test_stdin is not None: + self._test_stdin.close() + self._test_stdin = None + + def _check_output_exact(self, out_name: str, expected: bytes) -> None: + """ + Check the output named :out_name: for an exact match against the :expected: content. + Saves the success and message. + """ + check_name = f"check_{out_name}" + actual = self._output[out_name] + if actual == expected: + self._success[check_name] = True + self._message[check_name] = f"{out_name} matches!" + else: + self._success[check_name] = False + self._message[check_name] = f"{out_name} does not match!\n> diff expected actual\n{diff(expected, actual)}" + + def _check_output_glob(self, out_name: str, expected: bytes) -> None: + """ + Check the output named :out_name: for a glob match against the :expected: glob. + Saves the success and message. + """ + check_name = f"check_{out_name}" + actual = self._output[out_name] + diff = glob_diff(actual, expected) + if diff is None: + self._success[check_name] = True + self._message[check_name] = f"{out_name} matches!" + else: + utf8_diff = diff.decode('utf8') + self._success[check_name] = False + self._message[check_name] = f"{out_name} does not match!\n> diff expected actual\n{utf8_diff}" + + def _check_output(self, out_name: str) -> None: + """ + Checks the output named :out_name: for a match against the expectation. + We check for a .exact, .glob, and a .ignore file. If none are found we + expect that the output should be empty. + + If :Options.preserve: was set then we save the scratch directory and + save the stderr, stdout, and exit code to the scratch directory for + debugging. + """ + if self._opts.preserve: + # Save the output to the scratch directory + actual_name = os.path.join(self._scratch_dir, f"{out_name}") + with open(actual_name, "wb") as f: + f.write(self._output[out_name]) + + exact_name = f"{self._test_file}.{out_name}.exact" + glob_name = f"{self._test_file}.{out_name}.glob" + ignore_name = f"{self._test_file}.{out_name}.ignore" + + if os.path.exists(exact_name): + return self._check_output_exact(out_name, read_file(exact_name)) + elif os.path.exists(glob_name): + return self._check_output_glob(out_name, read_file(glob_name)) + elif os.path.exists(ignore_name): + check_name = f"check_{out_name}" + self._success[check_name] = True + self._message[check_name] = f"{out_name} ignored!" + else: + return self._check_output_exact(out_name, bytes()) + + def _check_stderr(self) -> None: + """Checks the stderr output against the expectation.""" + self._check_output("stderr") + + def _check_stdout(self) -> None: + """Checks the stdout output against the expectation.""" + self._check_output("stdout") + + def _check_exit(self) -> None: + """ + Checks the exit code against expectations. If a .exit file + exists, we expect that the exit code matches the contents. + Otherwise we expect the exit code to be zero. + + If :Options.preserve: is set we save the exit code to the + scratch directory under the filename "exit". + """ + if self._opts.preserve: + exit_name = os.path.join(self._scratch_dir, "exit") + with open(exit_name, "w") as f: + f.write(str(self._exit_code) + "\n") + exit_name = f"{self._test_file}.exit" + if os.path.exists(exit_name): + exit_code: int = int(read_file(exit_name)) + else: + exit_code: int = 0 + if exit_code == self._exit_code: + self._success["check_exit"] = True + self._message["check_exit"] = "Exit code matches!" + else: + self._success["check_exit"] = False + self._message["check_exit"] = f"Exit code mismatch! Expected {exit_code} but got {self._exit_code}" + + def _analyze_results(self) -> None: + """ + After all tests have been checked, collect all the successes + and messages, and print the results to stdout. + """ + STATUS = {True: "PASS", False: "FAIL"} + checks = sorted(self._success.keys()) + self._succeeded = all(self._success.values()) + self._log(f"{STATUS[self._succeeded]}: {self._test_name}") + + if not self._succeeded or self._opts.verbose: + for check in checks: + if self._opts.verbose or not self._success[check]: + self._log(f"{STATUS[self._success[check]]}: {self._test_name}.{check}") + self._log(self._message[check]) + + self._log("----------------------------------------") + + +class TestSuite: + """ + Setup & teardown test suite & cases. + This class is intended to be used as a context manager. + + TODO: Make setup/teardown failure emit messages, not throw exceptions. + """ + def __init__(self, test_directory: str, options: Options) -> None: + self._opts = options + self._test_dir = os.path.abspath(test_directory) + rel_test_dir = os.path.relpath(test_directory, start=self._opts.test_dir) + assert not rel_test_dir.startswith(os.path.sep) + self._scratch_dir = os.path.normpath(os.path.join(self._opts.scratch_dir, rel_test_dir)) + + def __enter__(self) -> 'TestSuite': + self._setup_once() + return self + + def __exit__(self, _exc_type, _exc_value, _traceback) -> None: + self._teardown_once() + + @contextlib.contextmanager + def test_case(self, test_basename: str) -> TestCase: + """ + Context manager for a test case in the test suite. + Pass the basename of the test relative to the :test_directory:. + """ + assert os.path.dirname(test_basename) == "" + try: + self._setup(test_basename) + test_filename = os.path.join(self._test_dir, test_basename) + yield TestCase(test_filename, self._opts) + finally: + self._teardown(test_basename) + + def _remove_scratch_dir(self, dir: str) -> None: + """Helper to remove a scratch directory with sanity checks""" + assert "scratch" in dir + assert dir.startswith(self._scratch_dir) + assert os.path.exists(dir) + shutil.rmtree(dir) + + def _setup_once(self) -> None: + if os.path.exists(self._scratch_dir): + self._remove_scratch_dir(self._scratch_dir) + os.makedirs(self._scratch_dir) + setup_script = os.path.join(self._test_dir, "setup_once") + if os.path.exists(setup_script): + self._run_script(setup_script, cwd=self._scratch_dir) + + def _teardown_once(self) -> None: + assert os.path.exists(self._scratch_dir) + teardown_script = os.path.join(self._test_dir, "teardown_once") + if os.path.exists(teardown_script): + self._run_script(teardown_script, cwd=self._scratch_dir) + if not self._opts.preserve: + self._remove_scratch_dir(self._scratch_dir) + + def _setup(self, test_basename: str) -> None: + test_scratch_dir = os.path.join(self._scratch_dir, test_basename) + assert not os.path.exists(test_scratch_dir) + os.makedirs(test_scratch_dir) + setup_script = os.path.join(self._test_dir, "setup") + if os.path.exists(setup_script): + self._run_script(setup_script, cwd=test_scratch_dir) + + def _teardown(self, test_basename: str) -> None: + test_scratch_dir = os.path.join(self._scratch_dir, test_basename) + assert os.path.exists(test_scratch_dir) + teardown_script = os.path.join(self._test_dir, "teardown") + if os.path.exists(teardown_script): + self._run_script(teardown_script, cwd=test_scratch_dir) + if not self._opts.preserve: + self._remove_scratch_dir(test_scratch_dir) + + def _run_script(self, script: str, cwd: str) -> None: + env = copy.copy(os.environ) + for k, v in self._opts.env.items(): + env[k] = v + try: + subprocess.run( + args=[script], + stdin=subprocess.DEVNULL, + capture_output=True, + cwd=cwd, + env=env, + check=True, + ) + except subprocess.CalledProcessError as e: + print(f"{script} failed with exit code {e.returncode}!") + print(f"stderr:\n{e.stderr}") + print(f"stdout:\n{e.stdout}") + raise + +TestSuites = typing.Dict[str, typing.List[str]] + +def get_all_tests(options: Options) -> TestSuites: + """ + Find all the test in the test directory and return the test suites. + """ + test_suites = {} + for root, dirs, files in os.walk(options.test_dir, topdown=True): + dirs[:] = [d for d in dirs if not exclude_dir(d)] + test_cases = [] + for file in files: + if not exclude_file(file): + test_cases.append(file) + assert root == os.path.normpath(root) + test_suites[root] = test_cases + return test_suites + + +def resolve_listed_tests( + tests: typing.List[str], options: Options +) -> TestSuites: + """ + Resolve the list of tests passed on the command line into their + respective test suites. Tests can either be paths, or test names + relative to the test directory. + """ + test_suites = {} + for test in tests: + if not os.path.exists(test): + test = os.path.join(options.test_dir, test) + if not os.path.exists(test): + raise RuntimeError(f"Test {test} does not exist!") + + test = os.path.normpath(os.path.abspath(test)) + assert test.startswith(options.test_dir) + test_suite = os.path.dirname(test) + test_case = os.path.basename(test) + test_suites.setdefault(test_suite, []).append(test_case) + + return test_suites + +def run_tests(test_suites: TestSuites, options: Options) -> bool: + """ + Runs all the test in the :test_suites: with the given :options:. + Prints the results to stdout. + """ + tests = {} + for test_dir, test_files in test_suites.items(): + with TestSuite(test_dir, options) as test_suite: + test_files = sorted(set(test_files)) + for test_file in test_files: + with test_suite.test_case(test_file) as test_case: + tests[test_case.name] = test_case.run() + + successes = 0 + for test, status in tests.items(): + if status: + successes += 1 + else: + print(f"FAIL: {test}") + if successes == len(tests): + print(f"PASSED all {len(tests)} tests!") + return True + else: + print(f"FAILED {len(tests) - successes} / {len(tests)} tests!") + return False + + +if __name__ == "__main__": + CLI_TEST_DIR = os.path.dirname(sys.argv[0]) + REPO_DIR = os.path.join(CLI_TEST_DIR, "..", "..") + PROGRAMS_DIR = os.path.join(REPO_DIR, "programs") + TESTS_DIR = os.path.join(REPO_DIR, "tests") + ZSTD_PATH = os.path.join(PROGRAMS_DIR, "zstd") + ZSTDGREP_PATH = os.path.join(PROGRAMS_DIR, "zstdgrep") + DATAGEN_PATH = os.path.join(TESTS_DIR, "datagen") + + parser = argparse.ArgumentParser( + ( + "Runs the zstd CLI tests. Exits nonzero on failure. Default arguments are\n" + "generally correct. Pass --preserve to preserve test output for debugging,\n" + "and --verbose to get verbose test output.\n" + ) + ) + parser.add_argument( + "--preserve", + action="store_true", + help="Preserve the scratch directory TEST_DIR/scratch/ for debugging purposes." + ) + parser.add_argument("--verbose", action="store_true", help="Verbose test output.") + parser.add_argument("--timeout", default=60, type=int, help="Test case timeout in seconds. Set to 0 to disable timeouts.") + parser.add_argument( + "--exec-prefix", + default=None, + help="Sets the EXEC_PREFIX environment variable. Prefix to invocations of the zstd CLI." + ) + parser.add_argument( + "--zstd", + default=ZSTD_PATH, + help="Sets the ZSTD_BIN environment variable. Path of the zstd CLI." + ) + parser.add_argument( + "--zstdgrep", + default=ZSTDGREP_PATH, + help="Sets the ZSTDGREP_BIN environment variable. Path of the zstdgrep CLI." + ) + parser.add_argument( + "--datagen", + default=DATAGEN_PATH, + help="Sets the DATAGEN_BIN environment variable. Path to the datagen CLI." + ) + parser.add_argument( + "--test-dir", + default=CLI_TEST_DIR, + help=( + "Runs the tests under this directory. " + "Adds TEST_DIR/bin/ to path. " + "Scratch directory located in TEST_DIR/scratch/." + ) + ) + parser.add_argument( + "tests", + nargs="*", + help="Run only these test cases. Can either be paths or test names relative to TEST_DIR/" + ) + args = parser.parse_args() + + if args.timeout <= 0: + args.timeout = None + + args.test_dir = os.path.normpath(os.path.abspath(args.test_dir)) + bin_dir = os.path.join(args.test_dir, "bin") + scratch_dir = os.path.join(args.test_dir, "scratch") + + env = {} + if args.exec_prefix is not None: + env["EXEC_PREFIX"] = args.exec_prefix + env["ZSTD_BIN"] = os.path.abspath(args.zstd) + env["DATAGEN_BIN"] = os.path.abspath(args.datagen) + env["ZSTDGREP_BIN"] = os.path.abspath(args.zstdgrep) + env["COMMON"] = os.path.abspath(os.path.join(args.test_dir, "common")) + env["PATH"] = os.path.abspath(bin_dir) + ":" + os.getenv("PATH", "") + + opts = Options( + env=env, + timeout=args.timeout, + verbose=args.verbose, + preserve=args.preserve, + test_dir=args.test_dir, + scratch_dir=scratch_dir, + ) + + if len(args.tests) == 0: + tests = get_all_tests(opts) + else: + tests = resolve_listed_tests(args.tests, opts) + + success = run_tests(tests, opts) + if success: + sys.exit(0) + else: + sys.exit(1) + From 1fc42de86a53320c056c9a3ca9847eae7ce1262b Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Mon, 24 Jan 2022 13:52:08 -0800 Subject: [PATCH 065/472] [CI] Hook cli-tests up to CI Add cli-tests to `make test`. This adds a `python3` dependency to `make test`, but not `make check`. We could make this dependency optional by skipping the tests if `python3` is not present. --- tests/Makefile | 8 +- tests/cli-tests/basic/help.sh | 5 +- tests/cli-tests/basic/version.sh | 5 +- tests/cli-tests/bin/cmp_size | 2 - tests/cli-tests/bin/println | 2 +- tests/cli-tests/common/format.sh | 2 +- tests/cli-tests/common/mtime.sh | 2 +- tests/cli-tests/common/permissions.sh | 2 +- tests/cli-tests/compression/basic.sh | 8 +- tests/cli-tests/compression/format.sh | 2 +- tests/cli-tests/compression/levels.sh | 16 +-- .../compression/levels.sh.stderr.exact | 124 +++++++++--------- .../dict-builder/{no-inputs => no-inputs.sh} | 2 +- .../{no-inputs.exit => no-inputs.sh.exit} | 0 ...stderr.exact => no-inputs.sh.stderr.exact} | 2 +- .../dictionaries/dictionary-mismatch.sh | 4 +- .../dictionary-mismatch.sh.stderr.exact | 10 +- tests/cli-tests/dictionaries/setup_once | 2 +- 18 files changed, 102 insertions(+), 96 deletions(-) rename tests/cli-tests/dict-builder/{no-inputs => no-inputs.sh} (76%) rename tests/cli-tests/dict-builder/{no-inputs.exit => no-inputs.sh.exit} (100%) rename tests/cli-tests/dict-builder/{no-inputs.stderr.exact => no-inputs.sh.stderr.exact} (93%) diff --git a/tests/Makefile b/tests/Makefile index 132fa7a08..cb77b0160 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -297,7 +297,7 @@ check: shortest fuzztest: test-fuzzer test-zstream test-decodecorpus .PHONY: test -test: test-zstd test-fullbench test-fuzzer test-zstream test-invalidDictionaries test-legacy test-decodecorpus +test: test-zstd test-fullbench test-fuzzer test-zstream test-invalidDictionaries test-legacy test-decodecorpus test-cli-tests ifeq ($(QEMU_SYS),) test: test-pool endif @@ -322,6 +322,12 @@ test-zstd test-zstd32 test-zstd-nolegacy: datagen file $(ZSTD) EXE_PREFIX="$(QEMU_SYS)" ZSTD_BIN="$(ZSTD)" DATAGEN_BIN=./datagen ./playTests.sh $(ZSTDRTTEST) +test-cli-tests: ZSTD = $(PRGDIR)/zstd +test-cli-tests: zstd datagen + file $(ZSTD) + ./cli-tests/run.py --exec-prefix="$(QEMU_SYS)" --zstd="$(ZSTD)" --datagen=./datagen + + test-fullbench: fullbench datagen $(QEMU_SYS) ./fullbench -i1 $(QEMU_SYS) ./fullbench -i1 -P0 diff --git a/tests/cli-tests/basic/help.sh b/tests/cli-tests/basic/help.sh index c683b6a6a..927c3ffbc 100755 --- a/tests/cli-tests/basic/help.sh +++ b/tests/cli-tests/basic/help.sh @@ -1,4 +1,7 @@ -#!/bin/sh -e +#!/bin/sh + +set -e + println "+ zstd -h" zstd -h println "+ zstd -H" diff --git a/tests/cli-tests/basic/version.sh b/tests/cli-tests/basic/version.sh index d50de0f3c..f75eaa84f 100755 --- a/tests/cli-tests/basic/version.sh +++ b/tests/cli-tests/basic/version.sh @@ -1,3 +1,6 @@ -#!/bin/sh -e +#!/bin/sh + +set -e + zstd -V zstd --version diff --git a/tests/cli-tests/bin/cmp_size b/tests/cli-tests/bin/cmp_size index 5afa1c590..8e4bef88e 100755 --- a/tests/cli-tests/bin/cmp_size +++ b/tests/cli-tests/bin/cmp_size @@ -1,7 +1,5 @@ #!/bin/sh -# Small utility to - set -e usage() diff --git a/tests/cli-tests/bin/println b/tests/cli-tests/bin/println index 1da246047..494eb18c8 100755 --- a/tests/cli-tests/bin/println +++ b/tests/cli-tests/bin/println @@ -1,2 +1,2 @@ -#!/bin/env sh +#!/bin/sh printf '%b\n' "${*}" diff --git a/tests/cli-tests/common/format.sh b/tests/cli-tests/common/format.sh index 20ff0f056..e574e9730 100644 --- a/tests/cli-tests/common/format.sh +++ b/tests/cli-tests/common/format.sh @@ -1,6 +1,6 @@ #!/bin/sh -source "$COMMON/platform.sh" +. "$COMMON/platform.sh" zstd_supports_format() { diff --git a/tests/cli-tests/common/mtime.sh b/tests/cli-tests/common/mtime.sh index 7ce931a96..344074d39 100644 --- a/tests/cli-tests/common/mtime.sh +++ b/tests/cli-tests/common/mtime.sh @@ -1,4 +1,4 @@ -source "$COMMON/platform.sh" +. "$COMMON/platform.sh" MTIME="stat -c %Y" case "$UNAME" in diff --git a/tests/cli-tests/common/permissions.sh b/tests/cli-tests/common/permissions.sh index b1f6ea3ba..6bce1f0b3 100644 --- a/tests/cli-tests/common/permissions.sh +++ b/tests/cli-tests/common/permissions.sh @@ -1,4 +1,4 @@ -source "$COMMON/platform.sh" +. "$COMMON/platform.sh" GET_PERMS="stat -c %a" case "$UNAME" in diff --git a/tests/cli-tests/compression/basic.sh b/tests/cli-tests/compression/basic.sh index 6f0f87932..8b63e4076 100755 --- a/tests/cli-tests/compression/basic.sh +++ b/tests/cli-tests/compression/basic.sh @@ -1,7 +1,9 @@ -#!/bin/sh -e +#!/bin/sh -# Uncomment the set -x line for debugging -# set -x +set -e + +# Uncomment the set -v line for debugging +# set -v # Test compression flags and check that they work zstd file ; zstd -t file.zst diff --git a/tests/cli-tests/compression/format.sh b/tests/cli-tests/compression/format.sh index 86fb40080..192fa2cf2 100755 --- a/tests/cli-tests/compression/format.sh +++ b/tests/cli-tests/compression/format.sh @@ -1,6 +1,6 @@ #!/bin/sh -source "$COMMON/format.sh" +. "$COMMON/format.sh" set -e diff --git a/tests/cli-tests/compression/levels.sh b/tests/cli-tests/compression/levels.sh index 6bd0aca00..4837790ce 100755 --- a/tests/cli-tests/compression/levels.sh +++ b/tests/cli-tests/compression/levels.sh @@ -1,7 +1,7 @@ #!/bin/sh set -e -set -x +set -v datagen > file @@ -12,7 +12,7 @@ zstd -1 file -o file-1.zst zstd -19 file -o file-19.zst zstd -22 --ultra file -o file-22.zst -zstd -t file-{f10,f1,1,19,22}.zst +zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst file-22.zst cmp_size -ne file-19.zst file-22.zst cmp_size -lt file-19.zst file-1.zst @@ -41,10 +41,10 @@ ZSTD_CLEVEL=1 zstd file -o file-1-env.zst ZSTD_CLEVEL=+19 zstd file -o file-19-env.zst ZSTD_CLEVEL=+99 zstd file -o file-99-env.zst -cmp file-f10{,-env}.zst || die "Environment variable failed to set level" -cmp file-1{,-env}.zst || die "Environment variable failed to set level" -cmp file-19{,-env}.zst || die "Environment variable failed to set level" -cmp file-99{,-env}.zst || die "Environment variable failed to set level" +cmp file-f10.zst file-f10-env.zst || die "Environment variable failed to set level" +cmp file-1.zst file-1-env.zst || die "Environment variable failed to set level" +cmp file-19.zst file-19-env.zst || die "Environment variable failed to set level" +cmp file-99.zst file-99-env.zst || die "Environment variable failed to set level" # Test invalid environment clevel is the default level zstd -f file @@ -60,5 +60,5 @@ ZSTD_CLEVEL=5000000000 zstd -f file -o file-env.zst; cmp file.zst file-env.zst ZSTD_CLEVEL=10 zstd -f file -1 -o file-1-env.zst ZSTD_CLEVEL=10 zstd -f file --fast=1 -o file-f1-env.zst -cmp file-1{,-env}.zst || die "Environment variable not overridden" -cmp file-f1{,-env}.zst || die "Environment variable not overridden" +cmp file-1.zst file-1-env.zst || die "Environment variable not overridden" +cmp file-f1.zst file-f1-env.zst || die "Environment variable not overridden" diff --git a/tests/cli-tests/compression/levels.sh.stderr.exact b/tests/cli-tests/compression/levels.sh.stderr.exact index c0b7066fc..cb00433e6 100644 --- a/tests/cli-tests/compression/levels.sh.stderr.exact +++ b/tests/cli-tests/compression/levels.sh.stderr.exact @@ -1,75 +1,71 @@ -+ datagen -+ zstd --fast=10 file -o file-f10.zst -+ zstd --fast=1 file -o file-f1.zst -+ zstd -1 file -o file-1.zst -+ zstd -19 file -o file-19.zst -+ zstd -22 --ultra file -o file-22.zst -+ zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst file-22.zst -+ cmp_size -ne file-19.zst file-22.zst -+ cmp_size -lt file-19.zst file-1.zst -+ cmp_size -lt file-1.zst file-f1.zst -+ cmp_size -lt file-f1.zst file-f10.zst -+ zstd --fast file -f -+ cmp file.zst file-f1.zst -+ zstd -0 file -o file-0.zst -+ zstd -f file -+ cmp file.zst file-0.zst -+ zstd -99 file -o file-99.zst + +datagen > file + +# Compress with various levels and ensure that their sizes are ordered +zstd --fast=10 file -o file-f10.zst +zstd --fast=1 file -o file-f1.zst +zstd -1 file -o file-1.zst +zstd -19 file -o file-19.zst +zstd -22 --ultra file -o file-22.zst + +zstd -t file-f10.zst file-f1.zst file-1.zst file-19.zst file-22.zst + +cmp_size -ne file-19.zst file-22.zst +cmp_size -lt file-19.zst file-1.zst +cmp_size -lt file-1.zst file-f1.zst +cmp_size -lt file-f1.zst file-f10.zst + +# Test default levels +zstd --fast file -f +cmp file.zst file-f1.zst || die "--fast is not level -1" + +zstd -0 file -o file-0.zst +zstd -f file +cmp file.zst file-0.zst || die "Level 0 is not the default level" + +# Test level clamping +zstd -99 file -o file-99.zst Warning : compression level higher than max, reduced to 19 -+ cmp file-19.zst file-99.zst -+ zstd --fast=200000 file -c -+ zstd -t -+ zstd -5000000000 -f file +cmp file-19.zst file-99.zst || die "Level 99 is clamped to 19" +zstd --fast=200000 file -c | zstd -t + +zstd -5000000000 -f file && die "Level too large, must fail" ||: error: numeric value overflows 32-bit unsigned int -+ : -+ zstd --fast=5000000000 -f file +zstd --fast=5000000000 -f file && die "Level too large, must fail" ||: error: numeric value overflows 32-bit unsigned int -+ : -+ ZSTD_CLEVEL=-10 -+ zstd file -o file-f10-env.zst -+ ZSTD_CLEVEL=1 -+ zstd file -o file-1-env.zst -+ ZSTD_CLEVEL=+19 -+ zstd file -o file-19-env.zst -+ ZSTD_CLEVEL=+99 -+ zstd file -o file-99-env.zst + +# Test setting a level through the environment variable +ZSTD_CLEVEL=-10 zstd file -o file-f10-env.zst +ZSTD_CLEVEL=1 zstd file -o file-1-env.zst +ZSTD_CLEVEL=+19 zstd file -o file-19-env.zst +ZSTD_CLEVEL=+99 zstd file -o file-99-env.zst Warning : compression level higher than max, reduced to 19 -+ cmp file-f10.zst file-f10-env.zst -+ cmp file-1.zst file-1-env.zst -+ cmp file-19.zst file-19-env.zst -+ cmp file-99.zst file-99-env.zst -+ zstd -f file -+ ZSTD_CLEVEL=- -+ zstd -f file -o file-env.zst + +cmp file-f10.zst file-f10-env.zst || die "Environment variable failed to set level" +cmp file-1.zst file-1-env.zst || die "Environment variable failed to set level" +cmp file-19.zst file-19-env.zst || die "Environment variable failed to set level" +cmp file-99.zst file-99-env.zst || die "Environment variable failed to set level" + +# Test invalid environment clevel is the default level +zstd -f file +ZSTD_CLEVEL=- zstd -f file -o file-env.zst ; cmp file.zst file-env.zst Ignore environment variable setting ZSTD_CLEVEL=-: not a valid integer value -+ cmp file.zst file-env.zst -+ ZSTD_CLEVEL=+ -+ zstd -f file -o file-env.zst +ZSTD_CLEVEL=+ zstd -f file -o file-env.zst ; cmp file.zst file-env.zst Ignore environment variable setting ZSTD_CLEVEL=+: not a valid integer value -+ cmp file.zst file-env.zst -+ ZSTD_CLEVEL=a -+ zstd -f file -o file-env.zst +ZSTD_CLEVEL=a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst Ignore environment variable setting ZSTD_CLEVEL=a: not a valid integer value -+ cmp file.zst file-env.zst -+ ZSTD_CLEVEL=-a -+ zstd -f file -o file-env.zst +ZSTD_CLEVEL=-a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst Ignore environment variable setting ZSTD_CLEVEL=-a: not a valid integer value -+ cmp file.zst file-env.zst -+ ZSTD_CLEVEL=+a -+ zstd -f file -o file-env.zst +ZSTD_CLEVEL=+a zstd -f file -o file-env.zst ; cmp file.zst file-env.zst Ignore environment variable setting ZSTD_CLEVEL=+a: not a valid integer value -+ cmp file.zst file-env.zst -+ ZSTD_CLEVEL=3a7 -+ zstd -f file -o file-env.zst +ZSTD_CLEVEL=3a7 zstd -f file -o file-env.zst ; cmp file.zst file-env.zst Ignore environment variable setting ZSTD_CLEVEL=3a7: not a valid integer value -+ cmp file.zst file-env.zst -+ ZSTD_CLEVEL=5000000000 -+ zstd -f file -o file-env.zst +ZSTD_CLEVEL=5000000000 zstd -f file -o file-env.zst; cmp file.zst file-env.zst Ignore environment variable setting ZSTD_CLEVEL=5000000000: numeric value too large -+ cmp file.zst file-env.zst -+ ZSTD_CLEVEL=10 -+ zstd -f file -1 -o file-1-env.zst -+ ZSTD_CLEVEL=10 -+ zstd -f file --fast=1 -o file-f1-env.zst -+ cmp file-1.zst file-1-env.zst -+ cmp file-f1.zst file-f1-env.zst + +# Test environment clevel is overridden by command line +ZSTD_CLEVEL=10 zstd -f file -1 -o file-1-env.zst +ZSTD_CLEVEL=10 zstd -f file --fast=1 -o file-f1-env.zst + +cmp file-1.zst file-1-env.zst || die "Environment variable not overridden" +cmp file-f1.zst file-f1-env.zst || die "Environment variable not overridden" diff --git a/tests/cli-tests/dict-builder/no-inputs b/tests/cli-tests/dict-builder/no-inputs.sh similarity index 76% rename from tests/cli-tests/dict-builder/no-inputs rename to tests/cli-tests/dict-builder/no-inputs.sh index d37fdce5a..416b83742 100755 --- a/tests/cli-tests/dict-builder/no-inputs +++ b/tests/cli-tests/dict-builder/no-inputs.sh @@ -1,3 +1,3 @@ #!/bin/sh -set -x +set -v zstd --train diff --git a/tests/cli-tests/dict-builder/no-inputs.exit b/tests/cli-tests/dict-builder/no-inputs.sh.exit similarity index 100% rename from tests/cli-tests/dict-builder/no-inputs.exit rename to tests/cli-tests/dict-builder/no-inputs.sh.exit diff --git a/tests/cli-tests/dict-builder/no-inputs.stderr.exact b/tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact similarity index 93% rename from tests/cli-tests/dict-builder/no-inputs.stderr.exact rename to tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact index b3b5599d5..d7b3ea020 100644 --- a/tests/cli-tests/dict-builder/no-inputs.stderr.exact +++ b/tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact @@ -1,4 +1,4 @@ -+ zstd --train +zstd --train ! Warning : nb of samples too low for proper processing ! ! Please provide _one file per sample_. ! Alternatively, split files into fixed-size blocks representative of samples, with -B# diff --git a/tests/cli-tests/dictionaries/dictionary-mismatch.sh b/tests/cli-tests/dictionaries/dictionary-mismatch.sh index 2b5d5a0d2..8264ccca5 100755 --- a/tests/cli-tests/dictionaries/dictionary-mismatch.sh +++ b/tests/cli-tests/dictionaries/dictionary-mismatch.sh @@ -1,6 +1,6 @@ #!/bin/sh -source "$COMMON/platform.sh" +. "$COMMON/platform.sh" set -e @@ -22,7 +22,7 @@ if [ false ]; then datagen -g1000 -s0 > file0 fi -set -x +set -v zstd files/0 -D dicts/0 zstd -t files/0.zst -D dicts/0 zstd -t files/0.zst -D dicts/1 && die "Must fail" ||: diff --git a/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact b/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact index 399a3207d..0afea722e 100644 --- a/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact +++ b/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact @@ -1,8 +1,6 @@ -+ zstd files/0 -D dicts/0 -+ zstd -t files/0.zst -D dicts/0 -+ zstd -t files/0.zst -D dicts/1 +zstd files/0 -D dicts/0 +zstd -t files/0.zst -D dicts/0 +zstd -t files/0.zst -D dicts/1 && die "Must fail" ||: files/0.zst : Decoding error (36) : Dictionary mismatch -+ : -+ zstd -t files/0.zst +zstd -t files/0.zst && die "Must fail" ||: files/0.zst : Decoding error (36) : Dictionary mismatch -+ : diff --git a/tests/cli-tests/dictionaries/setup_once b/tests/cli-tests/dictionaries/setup_once index 6316df165..1241c5782 100755 --- a/tests/cli-tests/dictionaries/setup_once +++ b/tests/cli-tests/dictionaries/setup_once @@ -2,7 +2,7 @@ set -e -source "$COMMON/platform.sh" +. "$COMMON/platform.sh" mkdir files/ dicts/ From d64d5ddc57ac58f3bcff2bd531cbe1e71bc4e356 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 27 Jan 2022 14:54:18 -0800 Subject: [PATCH 066/472] fix 44122 test error It's a bug in the test itself, in exceptional circumstances (no more space for additional sequence). There should be enough room for all cases to work fine from now on, and if not, we have an additional `assert()` to catch that situation. --- tests/fuzz/sequence_compression_api.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/fuzz/sequence_compression_api.c b/tests/fuzz/sequence_compression_api.c index b35f5a795..443e0a181 100644 --- a/tests/fuzz/sequence_compression_api.c +++ b/tests/fuzz/sequence_compression_api.c @@ -153,7 +153,7 @@ static size_t generateRandomSequences(FUZZ_dataProducer_t* producer, matchLengthMax = MIN(matchLengthMax, blockSizeMax/2); } - while ( nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ-1 + while ( nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ-2 /* extra room for explicit delimiters */ && bytesGenerated < ZSTD_FUZZ_GENERATED_SRC_MAXSIZE && !FUZZ_dataProducer_empty(producer)) { uint32_t matchLength; @@ -214,6 +214,7 @@ static size_t generateRandomSequences(FUZZ_dataProducer_t* producer, if (mode == ZSTD_sf_explicitBlockDelimiters) { /* always end sequences with a block delimiter */ const ZSTD_Sequence endBlock = {0, 0, 0, 0}; + assert(nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ); generatedSequences[nbSeqGenerated++] = endBlock; } From 9a68840176ec9334060b2379f204ada59408bfd1 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 27 Jan 2022 11:06:16 -0800 Subject: [PATCH 067/472] minor refactor to blocksplit notably simplication of ZSTD_deriveSeqStoreChunk() --- lib/common/zstd_internal.h | 10 +++++----- lib/compress/zstd_compress.c | 38 +++++++++++++++++------------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/lib/common/zstd_internal.h b/lib/common/zstd_internal.h index ff2c2cd44..4e19cb3c2 100644 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@ -299,11 +299,11 @@ typedef enum { typedef struct { seqDef* sequencesStart; seqDef* sequences; /* ptr to end of sequences */ - BYTE* litStart; - BYTE* lit; /* ptr to end of literals */ - BYTE* llCode; - BYTE* mlCode; - BYTE* ofCode; + BYTE* litStart; + BYTE* lit; /* ptr to end of literals */ + BYTE* llCode; + BYTE* mlCode; + BYTE* ofCode; size_t maxNbSeq; size_t maxNbLit; diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 3a2481892..c82901570 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -3394,15 +3394,12 @@ static size_t ZSTD_countSeqStoreMatchBytes(const seqStore_t* const seqStore) { */ static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore, const seqStore_t* originalSeqStore, - size_t startIdx, size_t endIdx) { - BYTE* const litEnd = originalSeqStore->lit; - size_t literalsBytes; - size_t literalsBytesPreceding = 0; - + size_t startIdx, size_t endIdx) +{ *resultSeqStore = *originalSeqStore; if (startIdx > 0) { resultSeqStore->sequences = originalSeqStore->sequencesStart + startIdx; - literalsBytesPreceding = ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); + resultSeqStore->litStart += ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); } /* Move longLengthPos into the correct position if necessary */ @@ -3415,13 +3412,12 @@ static void ZSTD_deriveSeqStoreChunk(seqStore_t* resultSeqStore, } resultSeqStore->sequencesStart = originalSeqStore->sequencesStart + startIdx; resultSeqStore->sequences = originalSeqStore->sequencesStart + endIdx; - literalsBytes = ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); - resultSeqStore->litStart += literalsBytesPreceding; if (endIdx == (size_t)(originalSeqStore->sequences - originalSeqStore->sequencesStart)) { /* This accounts for possible last literals if the derived chunk reaches the end of the block */ - resultSeqStore->lit = litEnd; + assert(resultSeqStore->lit == originalSeqStore->lit); } else { - resultSeqStore->lit = resultSeqStore->litStart+literalsBytes; + size_t const literalsBytes = ZSTD_countSeqStoreLiteralsBytes(resultSeqStore); + resultSeqStore->lit = resultSeqStore->litStart + literalsBytes; } resultSeqStore->llCode += startIdx; resultSeqStore->mlCode += startIdx; @@ -3580,7 +3576,8 @@ typedef struct { * In theory, this means the absolute largest recursion depth is 10 == log2(maxNbSeqInBlock/MIN_SEQUENCES_BLOCK_SPLITTING). * In practice, recursion depth usually doesn't go beyond 4. * - * Furthermore, the number of splits is capped by ZSTD_MAX_NB_BLOCK_SPLITS. At ZSTD_MAX_NB_BLOCK_SPLITS == 196 with the current existing blockSize + * Furthermore, the number of splits is capped by ZSTD_MAX_NB_BLOCK_SPLITS. + * At ZSTD_MAX_NB_BLOCK_SPLITS == 196 with the current existing blockSize * maximum of 128 KB, this value is actually impossible to reach. */ static void @@ -3599,19 +3596,20 @@ ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx, size_t end DEBUGLOG(6, "ZSTD_deriveBlockSplitsHelper: Too few sequences"); return; } - DEBUGLOG(4, "ZSTD_deriveBlockSplitsHelper: startIdx=%zu endIdx=%zu", startIdx, endIdx); + DEBUGLOG(5, "ZSTD_deriveBlockSplitsHelper: startIdx=%zu endIdx=%zu", startIdx, endIdx); ZSTD_deriveSeqStoreChunk(fullSeqStoreChunk, origSeqStore, startIdx, endIdx); ZSTD_deriveSeqStoreChunk(firstHalfSeqStore, origSeqStore, startIdx, midIdx); ZSTD_deriveSeqStoreChunk(secondHalfSeqStore, origSeqStore, midIdx, endIdx); estimatedOriginalSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(fullSeqStoreChunk, zc); estimatedFirstHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(firstHalfSeqStore, zc); estimatedSecondHalfSize = ZSTD_buildEntropyStatisticsAndEstimateSubBlockSize(secondHalfSeqStore, zc); - DEBUGLOG(4, "Estimated original block size: %zu -- First half split: %zu -- Second half split: %zu", + DEBUGLOG(5, "Estimated original block size: %zu -- First half split: %zu -- Second half split: %zu", estimatedOriginalSize, estimatedFirstHalfSize, estimatedSecondHalfSize); if (ZSTD_isError(estimatedOriginalSize) || ZSTD_isError(estimatedFirstHalfSize) || ZSTD_isError(estimatedSecondHalfSize)) { return; } if (estimatedFirstHalfSize + estimatedSecondHalfSize < estimatedOriginalSize) { + DEBUGLOG(5, "split decided at seqNb:%zu", midIdx); ZSTD_deriveBlockSplitsHelper(splits, startIdx, midIdx, zc, origSeqStore); splits->splitLocations[splits->idx] = (U32)midIdx; splits->idx++; @@ -3623,10 +3621,11 @@ ZSTD_deriveBlockSplitsHelper(seqStoreSplits* splits, size_t startIdx, size_t end * * Returns the number of splits made (which equals the size of the partition table - 1). */ -static size_t ZSTD_deriveBlockSplits(ZSTD_CCtx* zc, U32 partitions[], U32 nbSeq) { +static size_t ZSTD_deriveBlockSplits(ZSTD_CCtx* zc, U32 partitions[], U32 nbSeq) +{ seqStoreSplits splits = {partitions, 0}; if (nbSeq <= 4) { - DEBUGLOG(4, "ZSTD_deriveBlockSplits: Too few sequences to split"); + DEBUGLOG(5, "ZSTD_deriveBlockSplits: Too few sequences to split"); /* Refuse to try and split anything with less than 4 sequences */ return 0; } @@ -3693,12 +3692,11 @@ ZSTD_compressBlock_splitBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapac ZSTD_deriveSeqStoreChunk(currSeqStore, &zc->seqStore, 0, partitions[0]); for (i = 0; i <= numSplits; ++i) { - size_t srcBytes; size_t cSizeChunk; U32 const lastPartition = (i == numSplits); U32 lastBlockEntireSrc = 0; - srcBytes = ZSTD_countSeqStoreLiteralsBytes(currSeqStore) + ZSTD_countSeqStoreMatchBytes(currSeqStore); + size_t srcBytes = ZSTD_countSeqStoreLiteralsBytes(currSeqStore) + ZSTD_countSeqStoreMatchBytes(currSeqStore); srcBytesTotal += srcBytes; if (lastPartition) { /* This is the final partition, need to account for possible last literals */ @@ -3765,9 +3763,9 @@ ZSTD_compressBlock_internal(ZSTD_CCtx* zc, void* dst, size_t dstCapacity, const void* src, size_t srcSize, U32 frame) { - /* This the upper bound for the length of an rle block. - * This isn't the actual upper bound. Finding the real threshold - * needs further investigation. + /* This is an estimated upper bound for the length of an rle block. + * This isn't the actual upper bound. + * Finding the real threshold needs further investigation. */ const U32 rleMaxLength = 25; size_t cSize; From 637b2d7a24faf32b3cd465b6d46d890ed1e8ff6d Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sat, 29 Jan 2022 16:23:21 -0800 Subject: [PATCH 068/472] fixed bug 44168 discovered by oss-fuzz It's a bug in the test itself : ZSTD_compressBound() as an upper bound of the compress size only works for data compressed "normally". But in situations where many flushes are forcefully introduced, this creates many more blocks, each of which has a potential to increase the size by 3 bytes. In extreme cases (lots of small incompressible blocks), the expansion can go beyond ZSTD_compressBound(). This situation is similar when using the CompressSequences() API with Explicit Block Delimiters. In which case, each explicit block acts like a deliberate flush. When employed by a fuzzer, it's possible to generate scenarios like the one described above, with tons of incompressible blocks of small sizes, thus going beyond ZSTD_compressBound(). fix : when using Explicit Block Delimiters, use a larger bound, to account for this scenario. --- lib/common/zstd_internal.h | 4 ++-- lib/compress/zstd_compress.c | 2 +- tests/fuzz/sequence_compression_api.c | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/common/zstd_internal.h b/lib/common/zstd_internal.h index 4e19cb3c2..485b23a69 100644 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@ -311,8 +311,8 @@ typedef struct { * in the seqStore that has a value larger than U16 (if it exists). To do so, we increment * the existing value of the litLength or matchLength by 0x10000. */ - ZSTD_longLengthType_e longLengthType; - U32 longLengthPos; /* Index of the sequence to apply long length modification to */ + ZSTD_longLengthType_e longLengthType; + U32 longLengthPos; /* Index of the sequence to apply long length modification to */ } seqStore_t; typedef struct { diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index c82901570..b9358fa0c 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -6140,7 +6140,7 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, FORWARD_IF_ERROR(blockSize, "Error while trying to determine block size"); assert(blockSize <= remaining); ZSTD_resetSeqStore(&cctx->seqStore); - DEBUGLOG(5, "Working on new block. Blocksize: %zu", blockSize); + DEBUGLOG(5, "Working on new block. Blocksize: %zu (total:%zu)", blockSize, (ip - (const BYTE*)src) + blockSize); additionalByteAdjustment = sequenceCopier(cctx, &seqPos, inSeqs, inSeqsSize, ip, blockSize); FORWARD_IF_ERROR(additionalByteAdjustment, "Bad sequence copy"); diff --git a/tests/fuzz/sequence_compression_api.c b/tests/fuzz/sequence_compression_api.c index 443e0a181..68923e11e 100644 --- a/tests/fuzz/sequence_compression_api.c +++ b/tests/fuzz/sequence_compression_api.c @@ -297,7 +297,11 @@ int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size) } nbSequences = generateRandomSequences(producer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictSize, wLog, mode); generatedSrcSize = decodeSequences(generatedSrc, nbSequences, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictBuffer, dictSize, mode); - cBufSize = ZSTD_compressBound(generatedSrcSize); + /* Note : in explicit block delimiters mode, + * the fuzzer might generate a lot of small incompressible blocks. + * In which case, the final compressed size might be > ZSTD_compressBound(). + * Solution : provide a much more generous cBufSize to cover these scenarios */ + cBufSize = (mode == ZSTD_sf_noBlockDelimiters) ? ZSTD_compressBound(generatedSrcSize) : 256 + (generatedSrcSize * 2); cBuf = FUZZ_malloc(cBufSize); rBufSize = generatedSrcSize; From 8d65f87416740444da4a713d2778b78c11c6b38b Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Sun, 30 Jan 2022 12:16:16 -0800 Subject: [PATCH 069/472] Fix static analysis false-positives * It couldn't detect that the `fastCoverParams` can't be non-null, since it was just an assertion. * It thought we were accesing `wksp->dtable` beyond the bounds because we were using it to set the `workSpace` value. Instead, compute the workspace size used in a different way. --- lib/common/fse.h | 2 +- lib/common/fse_decompress.c | 3 ++- programs/dibio.c | 8 +++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/common/fse.h b/lib/common/fse.h index 714bfd3e7..bd29e9ac5 100644 --- a/lib/common/fse.h +++ b/lib/common/fse.h @@ -353,7 +353,7 @@ size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits); size_t FSE_buildDTable_rle (FSE_DTable* dt, unsigned char symbolValue); /**< build a fake FSE_DTable, designed to always generate the same symbolValue */ -#define FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) (FSE_DTABLE_SIZE_U32(maxTableLog) + FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) + (FSE_MAX_SYMBOL_VALUE + 1) / 2 + 1) +#define FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) (FSE_DTABLE_SIZE_U32(maxTableLog) + 1 + FSE_BUILD_DTABLE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) + (FSE_MAX_SYMBOL_VALUE + 1) / 2 + 1) #define FSE_DECOMPRESS_WKSP_SIZE(maxTableLog, maxSymbolValue) (FSE_DECOMPRESS_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(unsigned)) size_t FSE_decompress_wksp(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize); /**< same as FSE_decompress(), using an externally allocated `workSpace` produced with `FSE_DECOMPRESS_WKSP_SIZE_U32(maxLog, maxSymbolValue)` */ diff --git a/lib/common/fse_decompress.c b/lib/common/fse_decompress.c index a5a358015..bc0c1be2f 100644 --- a/lib/common/fse_decompress.c +++ b/lib/common/fse_decompress.c @@ -342,7 +342,8 @@ FORCE_INLINE_TEMPLATE size_t FSE_decompress_wksp_body( } if (FSE_DECOMPRESS_WKSP_SIZE(tableLog, maxSymbolValue) > wkspSize) return ERROR(tableLog_tooLarge); - workSpace = wksp->dtable + FSE_DTABLE_SIZE_U32(tableLog); + assert(sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog) <= wkspSize); + workSpace = (BYTE*)workSpace + sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog); wkspSize -= sizeof(*wksp) + FSE_DTABLE_SIZE(tableLog); CHECK_F( FSE_buildDTable_internal(wksp->dtable, wksp->ncount, maxSymbolValue, tableLog, workSpace, wkspSize) ); diff --git a/programs/dibio.c b/programs/dibio.c index 147d1e7bf..fddbc9e57 100644 --- a/programs/dibio.c +++ b/programs/dibio.c @@ -31,6 +31,7 @@ #include "timefn.h" /* UTIL_time_t, UTIL_clockSpanMicro, UTIL_getTime */ #include "../lib/common/debug.h" /* assert */ #include "../lib/common/mem.h" /* read */ +#include "../lib/zstd_errors.h" #include "dibio.h" @@ -380,7 +381,7 @@ int DiB_trainFromFiles(const char* dictFileName, size_t maxDictSize, srcBuffer, &loadedSize, sampleSizes, fs.nbSamples, fileNamesTable, nbFiles, chunkSize, displayLevel); - { size_t dictSize; + { size_t dictSize = ZSTD_error_GENERIC; if (params) { DiB_fillNoise((char*)srcBuffer + loadedSize, NOISELENGTH); /* guard band, for end of buffer condition */ dictSize = ZDICT_trainFromBuffer_legacy(dictBuffer, maxDictSize, @@ -400,8 +401,7 @@ int DiB_trainFromFiles(const char* dictFileName, size_t maxDictSize, dictSize = ZDICT_trainFromBuffer_cover(dictBuffer, maxDictSize, srcBuffer, sampleSizes, nbSamplesLoaded, *coverParams); } - } else { - assert(fastCoverParams != NULL); + } else if (fastCoverParams != NULL) { if (optimize) { dictSize = ZDICT_optimizeTrainFromBuffer_fastCover(dictBuffer, maxDictSize, srcBuffer, sampleSizes, nbSamplesLoaded, @@ -416,6 +416,8 @@ int DiB_trainFromFiles(const char* dictFileName, size_t maxDictSize, dictSize = ZDICT_trainFromBuffer_fastCover(dictBuffer, maxDictSize, srcBuffer, sampleSizes, nbSamplesLoaded, *fastCoverParams); } + } else { + assert(0 /* Impossible */); } if (ZDICT_isError(dictSize)) { DISPLAYLEVEL(1, "dictionary training failed : %s \n", ZDICT_getErrorName(dictSize)); /* should not happen */ From 5b2c6c776acadcd86247fdaa3e48c11c6848263e Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Sun, 30 Jan 2022 20:42:35 -0500 Subject: [PATCH 070/472] meson: fix resource file compilation on Windows It needs to know about the correct include directories on its own. --- build/meson/lib/meson.build | 3 ++- build/meson/programs/meson.build | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build/meson/lib/meson.build b/build/meson/lib/meson.build index 6b0933781..bb761a4fc 100644 --- a/build/meson/lib/meson.build +++ b/build/meson/lib/meson.build @@ -83,7 +83,8 @@ libzstd_c_args = [] if cc_id == compiler_msvc if default_library_type != 'static' libzstd_sources += [windows_mod.compile_resources( - join_paths(zstd_rootdir, 'build/VS2010/libzstd-dll/libzstd-dll.rc'))] + join_paths(zstd_rootdir, 'build/VS2010/libzstd-dll/libzstd-dll.rc'), + include_directories: libzstd_includes)] libzstd_c_args += ['-DZSTD_DLL_EXPORT=1', '-DZSTD_HEAPMODE=0', '-D_CONSOLE', diff --git a/build/meson/programs/meson.build b/build/meson/programs/meson.build index 5ccd679a1..0704155d8 100644 --- a/build/meson/programs/meson.build +++ b/build/meson/programs/meson.build @@ -66,7 +66,8 @@ endif if cc_id == compiler_msvc if default_library_type != 'static' zstd_programs_sources += [windows_mod.compile_resources( - join_paths(zstd_rootdir, 'build/VS2010/zstd/zstd.rc'))] + join_paths(zstd_rootdir, 'build/VS2010/zstd/zstd.rc'), + include_directories: libzstd_includes)] endif endif From 84c05453db61a5c518bda486ea36b0c00fc645a1 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Sun, 30 Jan 2022 21:02:44 -0500 Subject: [PATCH 071/472] meson: never require a libm libm is not guaranteed to exist. POSIX requires the math functions to exist, but doesn't require to have it be a standalone library. On platforms where libm exists as a standalone library, it will always be found by meson -- it is shipped with libc. If it is not found, then we can safely assume the linker will make the math functions available by default. See https://mesonbuild.com/howtox.html#add-math-library-lm-portably Fixes building with bin_tests=true on Windows. --- build/meson/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/meson/meson.build b/build/meson/meson.build index 0c29a7621..e0ea3dff9 100644 --- a/build/meson/meson.build +++ b/build/meson/meson.build @@ -92,7 +92,7 @@ feature_lz4 = get_option('lz4') # Dependencies # ============================================================================= -libm_dep = cc.find_library('m', required: bin_tests) +libm_dep = cc.find_library('m', required: false) thread_dep = dependency('threads', required: feature_multi_thread) use_multi_thread = thread_dep.found() # Arguments in dependency should be equivalent to those passed to pkg-config From ef78b9af30422f8affe1ab35cd59b7170cde707a Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Sun, 30 Jan 2022 21:45:19 -0500 Subject: [PATCH 072/472] meson: valgrind wrapper should return correct errors While trying to raise an exception on failures, it instead raised an exception for misusing the exception. CalledProcessError is only supposed to be used when given a return code and a command, and it prints: Command '{cmd}' returned non-zero exit status {ret} Passing an error message string instead, just errored out with: TypeError: __init__() missing 1 required positional argument Instead use the subprocess module's base error which does accept string messages. Everything that used to error out, still errors out, but now they do so with a slightly prettier console message. --- build/meson/tests/valgrindTest.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build/meson/tests/valgrindTest.py b/build/meson/tests/valgrindTest.py index 218f7458b..05d84878b 100644 --- a/build/meson/tests/valgrindTest.py +++ b/build/meson/tests/valgrindTest.py @@ -21,7 +21,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): if subprocess.call([*VALGRIND_ARGS, zstd], stdout=subprocess.DEVNULL) == 0: - raise subprocess.CalledProcessError('zstd without argument should have failed') + raise subprocess.SubprocessError('zstd without argument should have failed') with subprocess.Popen([datagen, '-g80'], stdout=subprocess.PIPE) as p1, \ subprocess.Popen([*VALGRIND_ARGS, zstd, '-', '-c'], @@ -30,7 +30,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. p2.communicate() if p2.returncode != 0: - raise subprocess.CalledProcessError() + raise subprocess.SubprocessError() with subprocess.Popen([datagen, '-g16KB'], stdout=subprocess.PIPE) as p1, \ subprocess.Popen([*VALGRIND_ARGS, zstd, '-vf', '-', '-c'], @@ -39,7 +39,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): p1.stdout.close() p2.communicate() if p2.returncode != 0: - raise subprocess.CalledProcessError() + raise subprocess.SubprocessError() with tempfile.NamedTemporaryFile() as tmp_fd: with subprocess.Popen([datagen, '-g2930KB'], stdout=subprocess.PIPE) as p1, \ @@ -48,7 +48,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): p1.stdout.close() p2.communicate() if p2.returncode != 0: - raise subprocess.CalledProcessError() + raise subprocess.SubprocessError() subprocess.check_call([*VALGRIND_ARGS, zstd, '-vdf', tmp_fd.name, '-c'], stdout=subprocess.DEVNULL) @@ -60,7 +60,7 @@ def valgrindTest(valgrind, datagen, fuzzer, zstd, fullbench): p1.stdout.close() p2.communicate() if p2.returncode != 0: - raise subprocess.CalledProcessError() + raise subprocess.SubprocessError() subprocess.check_call([*VALGRIND_ARGS, fuzzer, '-T1mn', '-t1']) subprocess.check_call([*VALGRIND_ARGS, fullbench, '-i1']) From c01582dc8aee541171089fa2979c890752365104 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Sun, 30 Jan 2022 22:38:04 -0500 Subject: [PATCH 073/472] travis CI: update meson image to one with a python that isn't EOL Currently the build errors out with: ``` ERROR: This script does not work on Python 3.6 The minimum supported Python version is 3.7. Please use https://bootstrap.pypa.io/pip/3.6/get-pip.py instead. ``` While in theory this advice could be followed to get a better pip on xenial, Meson has now deprecated python 3.6 support too, and the next (unreleased) version requires python 3.7 There are a couple solutions to this: - hold the version of pip, allow pip to only install 3.6-compatible versions of meson (effectively freezing meson going forward) - install python 3.7 on xenial - update to a 2-year-old image instead of a 4-year-old one Option 3 is the simplest. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6a1295b4c..34cf0e1ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -92,8 +92,8 @@ matrix: - make -C tests versionsTest # meson dedicated test - - name: Xenial (Meson + clang) # ~15mn - dist: bionic + - name: Focal (Meson + clang) # ~15mn + dist: focal language: cpp compiler: clang install: From cc0657f27d81da8a7db3aa199d24a566b95c4dfe Mon Sep 17 00:00:00 2001 From: Yonatan Komornik <11005061+yoniko@users.noreply.github.com> Date: Mon, 31 Jan 2022 15:43:41 -0800 Subject: [PATCH 074/472] AsyncIO compression part 2 - added async read and asyncio to compression code (#3022) * Compression asyncio: - Added asyncio functionality for compression flow - Added ReadPool for async reads, implemented in both comp and decomp flows --- programs/README.md | 1 + programs/fileio.c | 423 ++++++++++++++++++-------------------- programs/fileio_asyncio.c | 353 ++++++++++++++++++++++++++----- programs/fileio_asyncio.h | 85 ++++++-- programs/fileio_common.h | 2 +- programs/fileio_types.h | 4 +- programs/zstdcli.c | 8 +- tests/playTests.sh | 15 +- 8 files changed, 590 insertions(+), 301 deletions(-) diff --git a/programs/README.md b/programs/README.md index 5570f90c3..b88cf78d7 100644 --- a/programs/README.md +++ b/programs/README.md @@ -164,6 +164,7 @@ Advanced arguments : --filelist FILE : read list of files to operate upon from FILE --output-dir-flat DIR : processed files are stored into DIR --output-dir-mirror DIR : processed files are stored into DIR respecting original directory structure +--[no-]asyncio : use asynchronous IO (default: enabled) --[no-]check : during compression, add XXH64 integrity checksum to frame (default: enabled). If specified with -d, decompressor will ignore/validate checksums in compressed frame (default: validate). -- : All arguments after "--" are treated as files diff --git a/programs/fileio.c b/programs/fileio.c index 64909b964..502f69c15 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -289,7 +289,7 @@ FIO_prefs_t* FIO_createPreferences(void) ret->literalCompressionMode = ZSTD_ps_auto; ret->excludeCompressedFiles = 0; ret->allowBlockDevices = 0; - ret->asyncIO = 0; + ret->asyncIO = AIO_supported(); return ret; } @@ -848,16 +848,12 @@ static int FIO_removeMultiFilesWarning(FIO_ctx_t* const fCtx, const FIO_prefs_t* * Compression ************************************************************************/ typedef struct { - FILE* srcFile; - FILE* dstFile; - void* srcBuffer; - size_t srcBufferSize; - void* dstBuffer; - size_t dstBufferSize; void* dictBuffer; size_t dictBufferSize; const char* dictFileName; ZSTD_CStream* cctx; + WritePoolCtx_t *writeCtx; + ReadPoolCtx_t *readCtx; } cRess_t; /** ZSTD_cycleLog() : @@ -906,9 +902,6 @@ static cRess_t FIO_createCResources(FIO_prefs_t* const prefs, if (ress.cctx == NULL) EXM_THROW(30, "allocation error (%s): can't create ZSTD_CCtx", strerror(errno)); - ress.srcBufferSize = ZSTD_CStreamInSize(); - ress.srcBuffer = malloc(ress.srcBufferSize); - ress.dstBufferSize = ZSTD_CStreamOutSize(); /* need to update memLimit before calling createDictBuffer * because of memLimit check inside it */ @@ -916,10 +909,10 @@ static cRess_t FIO_createCResources(FIO_prefs_t* const prefs, unsigned long long const ssSize = (unsigned long long)prefs->streamSrcSize; FIO_adjustParamsForPatchFromMode(prefs, &comprParams, UTIL_getFileSize(dictFileName), ssSize > 0 ? ssSize : maxSrcFileSize, cLevel); } - ress.dstBuffer = malloc(ress.dstBufferSize); ress.dictBufferSize = FIO_createDictBuffer(&ress.dictBuffer, dictFileName, prefs); /* works with dictFileName==NULL */ - if (!ress.srcBuffer || !ress.dstBuffer) - EXM_THROW(31, "allocation error : not enough memory"); + + ress.writeCtx = AIO_WritePool_create(prefs, ZSTD_CStreamOutSize()); + ress.readCtx = AIO_ReadPool_create(prefs, ZSTD_CStreamInSize()); /* Advanced parameters, including dictionary */ if (dictFileName && (ress.dictBuffer==NULL)) @@ -982,9 +975,9 @@ static cRess_t FIO_createCResources(FIO_prefs_t* const prefs, static void FIO_freeCResources(const cRess_t* const ress) { - free(ress->srcBuffer); - free(ress->dstBuffer); free(ress->dictBuffer); + AIO_WritePool_free(ress->writeCtx); + AIO_ReadPool_free(ress->readCtx); ZSTD_freeCStream(ress->cctx); /* never fails */ } @@ -997,6 +990,7 @@ FIO_compressGzFrame(const cRess_t* ress, /* buffers & handlers are used, but no { unsigned long long inFileSize = 0, outFileSize = 0; z_stream strm; + IOJob_t *writeJob = NULL; if (compressionLevel > Z_BEST_COMPRESSION) compressionLevel = Z_BEST_COMPRESSION; @@ -1012,51 +1006,58 @@ FIO_compressGzFrame(const cRess_t* ress, /* buffers & handlers are used, but no EXM_THROW(71, "zstd: %s: deflateInit2 error %d \n", srcFileName, ret); } } + writeJob = AIO_WritePool_acquireJob(ress->writeCtx); strm.next_in = 0; strm.avail_in = 0; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; while (1) { int ret; if (strm.avail_in == 0) { - size_t const inSize = fread(ress->srcBuffer, 1, ress->srcBufferSize, ress->srcFile); - if (inSize == 0) break; - inFileSize += inSize; - strm.next_in = (z_const unsigned char*)ress->srcBuffer; - strm.avail_in = (uInt)inSize; + AIO_ReadPool_fillBuffer(ress->readCtx, ZSTD_CStreamInSize()); + if (ress->readCtx->srcBufferLoaded == 0) break; + inFileSize += ress->readCtx->srcBufferLoaded; + strm.next_in = (z_const unsigned char*)ress->readCtx->srcBuffer; + strm.avail_in = (uInt)ress->readCtx->srcBufferLoaded; } - ret = deflate(&strm, Z_NO_FLUSH); + + { + size_t const availBefore = strm.avail_in; + ret = deflate(&strm, Z_NO_FLUSH); + AIO_ReadPool_consumeBytes(ress->readCtx, availBefore - strm.avail_in); + } + if (ret != Z_OK) EXM_THROW(72, "zstd: %s: deflate error %d \n", srcFileName, ret); - { size_t const cSize = ress->dstBufferSize - strm.avail_out; + { size_t const cSize = writeJob->bufferSize - strm.avail_out; if (cSize) { - if (fwrite(ress->dstBuffer, 1, cSize, ress->dstFile) != cSize) - EXM_THROW(73, "Write error : cannot write to output file : %s ", strerror(errno)); + writeJob->usedBufferSize = cSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += cSize; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; - } } + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; + } } if (srcFileSize == UTIL_FILESIZE_UNKNOWN) { DISPLAYUPDATE(2, "\rRead : %u MB ==> %.2f%% ", - (unsigned)(inFileSize>>20), - (double)outFileSize/inFileSize*100) + (unsigned)(inFileSize>>20), + (double)outFileSize/inFileSize*100) } else { DISPLAYUPDATE(2, "\rRead : %u / %u MB ==> %.2f%% ", - (unsigned)(inFileSize>>20), (unsigned)(srcFileSize>>20), - (double)outFileSize/inFileSize*100); - } } + (unsigned)(inFileSize>>20), (unsigned)(srcFileSize>>20), + (double)outFileSize/inFileSize*100); + } } while (1) { int const ret = deflate(&strm, Z_FINISH); - { size_t const cSize = ress->dstBufferSize - strm.avail_out; + { size_t const cSize = writeJob->bufferSize - strm.avail_out; if (cSize) { - if (fwrite(ress->dstBuffer, 1, cSize, ress->dstFile) != cSize) - EXM_THROW(75, "Write error : %s ", strerror(errno)); + writeJob->usedBufferSize = cSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += cSize; - strm.next_out = (Bytef*)ress->dstBuffer; - strm.avail_out = (uInt)ress->dstBufferSize; - } } + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; + } } if (ret == Z_STREAM_END) break; if (ret != Z_BUF_ERROR) EXM_THROW(77, "zstd: %s: deflate error %d \n", srcFileName, ret); @@ -1067,6 +1068,8 @@ FIO_compressGzFrame(const cRess_t* ress, /* buffers & handlers are used, but no EXM_THROW(79, "zstd: %s: deflateEnd error %d \n", srcFileName, ret); } } *readsize = inFileSize; + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return outFileSize; } #endif @@ -1082,6 +1085,7 @@ FIO_compressLzmaFrame(cRess_t* ress, lzma_stream strm = LZMA_STREAM_INIT; lzma_action action = LZMA_RUN; lzma_ret ret; + IOJob_t *writeJob = NULL; if (compressionLevel < 0) compressionLevel = 0; if (compressionLevel > 9) compressionLevel = 9; @@ -1099,31 +1103,37 @@ FIO_compressLzmaFrame(cRess_t* ress, EXM_THROW(83, "zstd: %s: lzma_easy_encoder error %d", srcFileName, ret); } + writeJob =AIO_WritePool_acquireJob(ress->writeCtx); + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = (uInt)writeJob->bufferSize; strm.next_in = 0; strm.avail_in = 0; - strm.next_out = (BYTE*)ress->dstBuffer; - strm.avail_out = ress->dstBufferSize; while (1) { if (strm.avail_in == 0) { - size_t const inSize = fread(ress->srcBuffer, 1, ress->srcBufferSize, ress->srcFile); - if (inSize == 0) action = LZMA_FINISH; + size_t const inSize = AIO_ReadPool_fillBuffer(ress->readCtx, ZSTD_CStreamInSize()); + if (ress->readCtx->srcBufferLoaded == 0) action = LZMA_FINISH; inFileSize += inSize; - strm.next_in = (BYTE const*)ress->srcBuffer; - strm.avail_in = inSize; + strm.next_in = (BYTE const*)ress->readCtx->srcBuffer; + strm.avail_in = ress->readCtx->srcBufferLoaded; + } + + { + size_t const availBefore = strm.avail_in; + ret = lzma_code(&strm, action); + AIO_ReadPool_consumeBytes(ress->readCtx, availBefore - strm.avail_in); } - ret = lzma_code(&strm, action); if (ret != LZMA_OK && ret != LZMA_STREAM_END) EXM_THROW(84, "zstd: %s: lzma_code encoding error %d", srcFileName, ret); - { size_t const compBytes = ress->dstBufferSize - strm.avail_out; + { size_t const compBytes = writeJob->bufferSize - strm.avail_out; if (compBytes) { - if (fwrite(ress->dstBuffer, 1, compBytes, ress->dstFile) != compBytes) - EXM_THROW(85, "Write error : %s", strerror(errno)); + writeJob->usedBufferSize = compBytes; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += compBytes; - strm.next_out = (BYTE*)ress->dstBuffer; - strm.avail_out = ress->dstBufferSize; + strm.next_out = (Bytef*)writeJob->buffer; + strm.avail_out = writeJob->bufferSize; } } if (srcFileSize == UTIL_FILESIZE_UNKNOWN) DISPLAYUPDATE(2, "\rRead : %u MB ==> %.2f%%", @@ -1139,6 +1149,9 @@ FIO_compressLzmaFrame(cRess_t* ress, lzma_end(&strm); *readsize = inFileSize; + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); + return outFileSize; } #endif @@ -1164,15 +1177,18 @@ FIO_compressLz4Frame(cRess_t* ress, LZ4F_preferences_t prefs; LZ4F_compressionContext_t ctx; + IOJob_t* writeJob = AIO_WritePool_acquireJob(ress->writeCtx); + LZ4F_errorCode_t const errorCode = LZ4F_createCompressionContext(&ctx, LZ4F_VERSION); if (LZ4F_isError(errorCode)) EXM_THROW(31, "zstd: failed to create lz4 compression context"); memset(&prefs, 0, sizeof(prefs)); - assert(blockSize <= ress->srcBufferSize); + assert(blockSize <= ress->readCtx->base.jobBufferSize); - prefs.autoFlush = 1; + /* autoflush off to mitigate a bug in lz4<=1.9.3 for compression level 12 */ + prefs.autoFlush = 0; prefs.compressionLevel = compressionLevel; prefs.frameInfo.blockMode = LZ4F_blockLinked; prefs.frameInfo.blockSizeID = LZ4F_max64KB; @@ -1180,27 +1196,25 @@ FIO_compressLz4Frame(cRess_t* ress, #if LZ4_VERSION_NUMBER >= 10600 prefs.frameInfo.contentSize = (srcFileSize==UTIL_FILESIZE_UNKNOWN) ? 0 : srcFileSize; #endif - assert(LZ4F_compressBound(blockSize, &prefs) <= ress->dstBufferSize); + assert(LZ4F_compressBound(blockSize, &prefs) <= writeJob->bufferSize); { - size_t readSize; - size_t headerSize = LZ4F_compressBegin(ctx, ress->dstBuffer, ress->dstBufferSize, &prefs); + size_t headerSize = LZ4F_compressBegin(ctx, writeJob->buffer, writeJob->bufferSize, &prefs); if (LZ4F_isError(headerSize)) EXM_THROW(33, "File header generation failed : %s", LZ4F_getErrorName(headerSize)); - if (fwrite(ress->dstBuffer, 1, headerSize, ress->dstFile) != headerSize) - EXM_THROW(34, "Write error : %s (cannot write header)", strerror(errno)); + writeJob->usedBufferSize = headerSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += headerSize; /* Read first block */ - readSize = fread(ress->srcBuffer, (size_t)1, (size_t)blockSize, ress->srcFile); - inFileSize += readSize; + inFileSize += AIO_ReadPool_fillBuffer(ress->readCtx, blockSize); /* Main Loop */ - while (readSize>0) { - size_t const outSize = LZ4F_compressUpdate(ctx, - ress->dstBuffer, ress->dstBufferSize, - ress->srcBuffer, readSize, NULL); + while (ress->readCtx->srcBufferLoaded) { + size_t inSize = MIN(blockSize, ress->readCtx->srcBufferLoaded); + size_t const outSize = LZ4F_compressUpdate(ctx, writeJob->buffer, writeJob->bufferSize, + ress->readCtx->srcBuffer, inSize, NULL); if (LZ4F_isError(outSize)) EXM_THROW(35, "zstd: %s: lz4 compression failed : %s", srcFileName, LZ4F_getErrorName(outSize)); @@ -1216,33 +1230,29 @@ FIO_compressLz4Frame(cRess_t* ress, } /* Write Block */ - { size_t const sizeCheck = fwrite(ress->dstBuffer, 1, outSize, ress->dstFile); - if (sizeCheck != outSize) - EXM_THROW(36, "Write error : %s", strerror(errno)); - } + writeJob->usedBufferSize = outSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); /* Read next block */ - readSize = fread(ress->srcBuffer, (size_t)1, (size_t)blockSize, ress->srcFile); - inFileSize += readSize; + AIO_ReadPool_consumeBytes(ress->readCtx, inSize); + inFileSize += AIO_ReadPool_fillBuffer(ress->readCtx, blockSize); } - if (ferror(ress->srcFile)) EXM_THROW(37, "Error reading %s ", srcFileName); /* End of Stream mark */ - headerSize = LZ4F_compressEnd(ctx, ress->dstBuffer, ress->dstBufferSize, NULL); + headerSize = LZ4F_compressEnd(ctx, writeJob->buffer, writeJob->bufferSize, NULL); if (LZ4F_isError(headerSize)) EXM_THROW(38, "zstd: %s: lz4 end of file generation failed : %s", srcFileName, LZ4F_getErrorName(headerSize)); - { size_t const sizeCheck = fwrite(ress->dstBuffer, 1, headerSize, ress->dstFile); - if (sizeCheck != headerSize) - EXM_THROW(39, "Write error : %s (cannot write end of stream)", - strerror(errno)); - } + writeJob->usedBufferSize = headerSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); outFileSize += headerSize; } *readsize = inFileSize; LZ4F_freeCompressionContext(ctx); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return outFileSize; } @@ -1257,8 +1267,8 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, int compressionLevel, U64* readsize) { cRess_t const ress = *ressPtr; - FILE* const srcFile = ress.srcFile; - FILE* const dstFile = ress.dstFile; + IOJob_t *writeJob = AIO_WritePool_acquireJob(ressPtr->writeCtx); + U64 compressedfilesize = 0; ZSTD_EndDirective directive = ZSTD_e_continue; U64 pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; @@ -1303,12 +1313,12 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, do { size_t stillToFlush; /* Fill input Buffer */ - size_t const inSize = fread(ress.srcBuffer, (size_t)1, ress.srcBufferSize, srcFile); - ZSTD_inBuffer inBuff = { ress.srcBuffer, inSize, 0 }; + size_t const inSize = AIO_ReadPool_fillBuffer(ress.readCtx, ZSTD_CStreamInSize()); + ZSTD_inBuffer inBuff = { ress.readCtx->srcBuffer, ress.readCtx->srcBufferLoaded, 0 }; DISPLAYLEVEL(6, "fread %u bytes from source \n", (unsigned)inSize); *readsize += inSize; - if ((inSize == 0) || (*readsize == fileSize)) + if ((ress.readCtx->srcBufferLoaded == 0) || (*readsize == fileSize)) directive = ZSTD_e_end; stillToFlush = 1; @@ -1316,9 +1326,10 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, || (directive == ZSTD_e_end && stillToFlush != 0) ) { size_t const oldIPos = inBuff.pos; - ZSTD_outBuffer outBuff = { ress.dstBuffer, ress.dstBufferSize, 0 }; + ZSTD_outBuffer outBuff= { writeJob->buffer, writeJob->bufferSize, 0 }; size_t const toFlushNow = ZSTD_toFlushNow(ress.cctx); CHECK_V(stillToFlush, ZSTD_compressStream2(ress.cctx, &outBuff, &inBuff, directive)); + AIO_ReadPool_consumeBytes(ress.readCtx, inBuff.pos - oldIPos); /* count stats */ inputPresented++; @@ -1327,12 +1338,10 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, /* Write compressed stream */ DISPLAYLEVEL(6, "ZSTD_compress_generic(end:%u) => input pos(%u)<=(%u)size ; output generated %u bytes \n", - (unsigned)directive, (unsigned)inBuff.pos, (unsigned)inBuff.size, (unsigned)outBuff.pos); + (unsigned)directive, (unsigned)inBuff.pos, (unsigned)inBuff.size, (unsigned)outBuff.pos); if (outBuff.pos) { - size_t const sizeCheck = fwrite(ress.dstBuffer, 1, outBuff.pos, dstFile); - if (sizeCheck != outBuff.pos) - EXM_THROW(25, "Write error : %s (cannot write compressed block)", - strerror(errno)); + writeJob->usedBufferSize = outBuff.pos; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); compressedfilesize += outBuff.pos; } @@ -1464,14 +1473,14 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, } /* while ((inBuff.pos != inBuff.size) */ } while (directive != ZSTD_e_end); - if (ferror(srcFile)) { - EXM_THROW(26, "Read error : I/O error"); - } if (fileSize != UTIL_FILESIZE_UNKNOWN && *readsize != fileSize) { EXM_THROW(27, "Read error : Incomplete read : %llu / %llu B", (unsigned long long)*readsize, (unsigned long long)fileSize); } + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ressPtr->writeCtx); + return compressedfilesize; } @@ -1572,7 +1581,7 @@ FIO_compressFilename_internal(FIO_ctx_t* const fCtx, /*! FIO_compressFilename_dstFile() : - * open dstFileName, or pass-through if ress.dstFile != NULL, + * open dstFileName, or pass-through if ress.file != NULL, * then start compression with FIO_compressFilename_internal(). * Manages source removal (--rm) and file permissions transfer. * note : ress.srcFile must be != NULL, @@ -1591,8 +1600,9 @@ static int FIO_compressFilename_dstFile(FIO_ctx_t* const fCtx, int result; stat_t statbuf; int transferMTime = 0; - assert(ress.srcFile != NULL); - if (ress.dstFile == NULL) { + FILE *dstFile; + assert(AIO_ReadPool_getFile(ress.readCtx) != NULL); + if (AIO_WritePool_getFile(ress.writeCtx) == NULL) { int dstFilePermissions = DEFAULT_FILE_PERMISSIONS; if ( strcmp (srcFileName, stdinmark) && strcmp (dstFileName, stdoutmark) @@ -1604,8 +1614,9 @@ static int FIO_compressFilename_dstFile(FIO_ctx_t* const fCtx, closeDstFile = 1; DISPLAYLEVEL(6, "FIO_compressFilename_dstFile: opening dst: %s \n", dstFileName); - ress.dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName, dstFilePermissions); - if (ress.dstFile==NULL) return 1; /* could not open dstFileName */ + dstFile = FIO_openDstFile(fCtx, prefs, srcFileName, dstFileName, dstFilePermissions); + if (dstFile==NULL) return 1; /* could not open dstFileName */ + AIO_WritePool_setFile(ress.writeCtx, dstFile); /* Must only be added after FIO_openDstFile() succeeds. * Otherwise we may delete the destination file if it already exists, * and the user presses Ctrl-C when asked if they wish to overwrite. @@ -1616,13 +1627,10 @@ static int FIO_compressFilename_dstFile(FIO_ctx_t* const fCtx, result = FIO_compressFilename_internal(fCtx, prefs, ress, dstFileName, srcFileName, compressionLevel); if (closeDstFile) { - FILE* const dstFile = ress.dstFile; - ress.dstFile = NULL; - clearHandler(); DISPLAYLEVEL(6, "FIO_compressFilename_dstFile: closing dst: %s \n", dstFileName); - if (fclose(dstFile)) { /* error closing dstFile */ + if (AIO_WritePool_closeFile(ress.writeCtx)) { /* error closing file */ DISPLAYLEVEL(1, "zstd: %s: %s \n", dstFileName, strerror(errno)); result=1; } @@ -1668,6 +1676,7 @@ FIO_compressFilename_srcFile(FIO_ctx_t* const fCtx, int compressionLevel) { int result; + FILE* srcFile; DISPLAYLEVEL(6, "FIO_compressFilename_srcFile: %s \n", srcFileName); /* ensure src is not a directory */ @@ -1691,13 +1700,13 @@ FIO_compressFilename_srcFile(FIO_ctx_t* const fCtx, return 0; } - ress.srcFile = FIO_openSrcFile(prefs, srcFileName); - if (ress.srcFile == NULL) return 1; /* srcFile could not be opened */ + srcFile = FIO_openSrcFile(prefs, srcFileName); + if (srcFile == NULL) return 1; /* srcFile could not be opened */ + AIO_ReadPool_setFile(ress.readCtx, srcFile); result = FIO_compressFilename_dstFile(fCtx, prefs, ress, dstFileName, srcFileName, compressionLevel); + AIO_ReadPool_closeFile(ress.readCtx); - fclose(ress.srcFile); - ress.srcFile = NULL; if ( prefs->removeSrcFile /* --rm */ && result == 0 /* success */ && strcmp(srcFileName, stdinmark) /* exception : don't erase stdin */ @@ -1844,23 +1853,24 @@ int FIO_compressMultipleFilenames(FIO_ctx_t* const fCtx, /* init */ assert(outFileName != NULL || suffix != NULL); if (outFileName != NULL) { /* output into a single destination (stdout typically) */ + FILE *dstFile; if (FIO_removeMultiFilesWarning(fCtx, prefs, outFileName, 1 /* displayLevelCutoff */)) { FIO_freeCResources(&ress); return 1; } - ress.dstFile = FIO_openDstFile(fCtx, prefs, NULL, outFileName, DEFAULT_FILE_PERMISSIONS); - if (ress.dstFile == NULL) { /* could not open outFileName */ + dstFile = FIO_openDstFile(fCtx, prefs, NULL, outFileName, DEFAULT_FILE_PERMISSIONS); + if (dstFile == NULL) { /* could not open outFileName */ error = 1; } else { + AIO_WritePool_setFile(ress.writeCtx, dstFile); for (; fCtx->currFileIdx < fCtx->nbFilesTotal; ++fCtx->currFileIdx) { status = FIO_compressFilename_srcFile(fCtx, prefs, ress, outFileName, inFileNamesTable[fCtx->currFileIdx], compressionLevel); if (!status) fCtx->nbFilesProcessed++; error |= status; } - if (fclose(ress.dstFile)) + if (AIO_WritePool_closeFile(ress.writeCtx)) EXM_THROW(29, "Write error (%s) : cannot properly close %s", strerror(errno), outFileName); - ress.dstFile = NULL; } } else { if (outMirroredRootDirName) @@ -1916,13 +1926,10 @@ int FIO_compressMultipleFilenames(FIO_ctx_t* const fCtx, /* ************************************************************************** * Decompression ***************************************************************************/ - typedef struct { - void* srcBuffer; - size_t srcBufferSize; - size_t srcBufferLoaded; ZSTD_DStream* dctx; WritePoolCtx_t *writeCtx; + ReadPoolCtx_t *readCtx; } dRess_t; static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFileName) @@ -1940,11 +1947,6 @@ static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFi CHECK( ZSTD_DCtx_setMaxWindowSize(ress.dctx, prefs->memLimit) ); CHECK( ZSTD_DCtx_setParameter(ress.dctx, ZSTD_d_forceIgnoreChecksum, !prefs->checksumFlag)); - ress.srcBufferSize = ZSTD_DStreamInSize(); - ress.srcBuffer = malloc(ress.srcBufferSize); - if (!ress.srcBuffer) - EXM_THROW(61, "Allocation error : not enough memory"); - /* dictionary */ { void* dictBuffer; size_t const dictBufferSize = FIO_createDictBuffer(&dictBuffer, dictFileName, prefs); @@ -1953,6 +1955,7 @@ static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFi } ress.writeCtx = AIO_WritePool_create(prefs, ZSTD_DStreamOutSize()); + ress.readCtx = AIO_ReadPool_create(prefs, ZSTD_DStreamInSize()); return ress; } @@ -1960,47 +1963,31 @@ static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFi static void FIO_freeDResources(dRess_t ress) { CHECK( ZSTD_freeDStream(ress.dctx) ); - free(ress.srcBuffer); AIO_WritePool_free(ress.writeCtx); -} - -/* FIO_consumeDSrcBuffer: - * Consumes len bytes from srcBuffer's start and moves the remaining data and srcBufferLoaded accordingly. */ -static void FIO_consumeDSrcBuffer(dRess_t *ress, size_t len) { - assert(ress->srcBufferLoaded >= len); - ress->srcBufferLoaded -= len; - memmove(ress->srcBuffer, (char *)ress->srcBuffer + len, ress->srcBufferLoaded); + AIO_ReadPool_free(ress.readCtx); } /** FIO_passThrough() : just copy input into output, for compatibility with gzip -df mode @return : 0 (no error) */ -static int FIO_passThrough(const FIO_prefs_t* const prefs, - FILE* foutput, FILE* finput, - void* buffer, size_t bufferSize, - size_t alreadyLoaded) +static int FIO_passThrough(dRess_t *ress) { - size_t const blockSize = MIN(64 KB, bufferSize); - size_t readFromInput; - unsigned storedSkips = 0; + size_t const blockSize = MIN(MIN(64 KB, ZSTD_DStreamInSize()), ZSTD_DStreamOutSize()); + IOJob_t *writeJob = AIO_WritePool_acquireJob(ress->writeCtx); + AIO_ReadPool_fillBuffer(ress->readCtx, blockSize); - /* assumption : ress->srcBufferLoaded bytes already loaded and stored within buffer */ - { size_t const sizeCheck = fwrite(buffer, 1, alreadyLoaded, foutput); - if (sizeCheck != alreadyLoaded) { - DISPLAYLEVEL(1, "Pass-through write error : %s\n", strerror(errno)); - return 1; - } } - - do { - readFromInput = fread(buffer, 1, blockSize, finput); - storedSkips = AIO_fwriteSparse(foutput, buffer, readFromInput, prefs, storedSkips); - } while (readFromInput == blockSize); - if (ferror(finput)) { - DISPLAYLEVEL(1, "Pass-through read error : %s\n", strerror(errno)); - return 1; + while(ress->readCtx->srcBufferLoaded) { + size_t writeSize; + writeSize = MIN(blockSize, ress->readCtx->srcBufferLoaded); + assert(writeSize <= writeJob->bufferSize); + memcpy(writeJob->buffer, ress->readCtx->srcBuffer, writeSize); + writeJob->usedBufferSize = writeSize; + AIO_WritePool_enqueueAndReacquireWriteJob(&writeJob); + AIO_ReadPool_consumeBytes(ress->readCtx, writeSize); + AIO_ReadPool_fillBuffer(ress->readCtx, blockSize); } - assert(feof(finput)); - - AIO_fwriteSparseEnd(prefs, foutput, storedSkips); + assert(ress->readCtx->reachedEof); + AIO_WritePool_releaseIoJob(writeJob); + AIO_WritePool_sparseWriteEnd(ress->writeCtx); return 0; } @@ -2018,7 +2005,7 @@ FIO_zstdErrorHelp(const FIO_prefs_t* const prefs, return; /* Try to decode the frame header */ - err = ZSTD_getFrameHeader(&header, ress->srcBuffer, ress->srcBufferLoaded); + err = ZSTD_getFrameHeader(&header, ress->readCtx->srcBuffer, ress->readCtx->srcBufferLoaded); if (err == 0) { unsigned long long const windowSize = header.windowSize; unsigned const windowLog = FIO_highbit64(windowSize) + ((windowSize & (windowSize - 1)) != 0); @@ -2041,7 +2028,7 @@ FIO_zstdErrorHelp(const FIO_prefs_t* const prefs, */ #define FIO_ERROR_FRAME_DECODING ((unsigned long long)(-2)) static unsigned long long -FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, +FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, const FIO_prefs_t* const prefs, const char* srcFileName, U64 alreadyDecoded) /* for multi-frames streams */ @@ -2057,16 +2044,11 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, ZSTD_DCtx_reset(ress->dctx, ZSTD_reset_session_only); /* Header loading : ensures ZSTD_getFrameHeader() will succeed */ - { size_t const toDecode = ZSTD_FRAMEHEADERSIZE_MAX; - if (ress->srcBufferLoaded < toDecode) { - size_t const toRead = toDecode - ress->srcBufferLoaded; - void* const startPosition = (char*)ress->srcBuffer + ress->srcBufferLoaded; - ress->srcBufferLoaded += fread(startPosition, 1, toRead, finput); - } } + AIO_ReadPool_fillBuffer(ress->readCtx, ZSTD_FRAMEHEADERSIZE_MAX); /* Main decompression Loop */ while (1) { - ZSTD_inBuffer inBuff = { ress->srcBuffer, ress->srcBufferLoaded, 0 }; + ZSTD_inBuffer inBuff = { ress->readCtx->srcBuffer, ress->readCtx->srcBufferLoaded, 0 }; ZSTD_outBuffer outBuff= { writeJob->buffer, writeJob->bufferSize, 0 }; size_t const readSizeHint = ZSTD_decompressStream(ress->dctx, &outBuff, &inBuff); const int displayLevel = (g_display_prefs.progressSetting == FIO_ps_always) ? 1 : 2; @@ -2088,7 +2070,7 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, if (srcFileNameSize > 18) { const char* truncatedSrcFileName = srcFileName + srcFileNameSize - 15; DISPLAYUPDATE(displayLevel, "\rDecompress: %2u/%2u files. Current: ...%s : %.*f%s... ", - fCtx->currFileIdx+1, fCtx->nbFilesTotal, truncatedSrcFileName, hrs.precision, hrs.value, hrs.suffix); + fCtx->currFileIdx+1, fCtx->nbFilesTotal, truncatedSrcFileName, hrs.precision, hrs.value, hrs.suffix); } else { DISPLAYUPDATE(displayLevel, "\rDecompress: %2u/%2u files. Current: %s : %.*f%s... ", fCtx->currFileIdx+1, fCtx->nbFilesTotal, srcFileName, hrs.precision, hrs.value, hrs.suffix); @@ -2098,23 +2080,21 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, srcFileName, hrs.precision, hrs.value, hrs.suffix); } - FIO_consumeDSrcBuffer(ress, inBuff.pos); + AIO_ReadPool_consumeBytes(ress->readCtx, inBuff.pos); if (readSizeHint == 0) break; /* end of frame */ /* Fill input buffer */ - { size_t const toDecode = MIN(readSizeHint, ress->srcBufferSize); /* support large skippable frames */ - if (ress->srcBufferLoaded < toDecode) { - size_t const toRead = toDecode - ress->srcBufferLoaded; /* > 0 */ - void* const startPosition = (char*)ress->srcBuffer + ress->srcBufferLoaded; - size_t const readSize = fread(startPosition, 1, toRead, finput); + { size_t const toDecode = MIN(readSizeHint, ZSTD_DStreamInSize()); /* support large skippable frames */ + if (ress->readCtx->srcBufferLoaded < toDecode) { + size_t const readSize = AIO_ReadPool_fillBuffer(ress->readCtx, toDecode); if (readSize==0) { DISPLAYLEVEL(1, "%s : Read error (39) : premature end \n", - srcFileName); + srcFileName); + AIO_WritePool_releaseIoJob(writeJob); return FIO_ERROR_FRAME_DECODING; } - ress->srcBufferLoaded += readSize; - } } } + } } } AIO_WritePool_releaseIoJob(writeJob); AIO_WritePool_sparseWriteEnd(ress->writeCtx); @@ -2125,7 +2105,7 @@ FIO_decompressZstdFrame(FIO_ctx_t* const fCtx, dRess_t* ress, FILE* finput, #ifdef ZSTD_GZDECOMPRESS static unsigned long long -FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, const char* srcFileName) +FIO_decompressGzFrame(dRess_t* ress, const char* srcFileName) { unsigned long long outFileSize = 0; z_stream strm; @@ -2145,16 +2125,16 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, const char* srcFileName) writeJob = AIO_WritePool_acquireJob(ress->writeCtx); strm.next_out = (Bytef*)writeJob->buffer; strm.avail_out = (uInt)writeJob->bufferSize; - strm.avail_in = (uInt)ress->srcBufferLoaded; - strm.next_in = (z_const unsigned char*)ress->srcBuffer; + strm.avail_in = (uInt)ress->readCtx->srcBufferLoaded; + strm.next_in = (z_const unsigned char*)ress->readCtx->srcBuffer; for ( ; ; ) { int ret; if (strm.avail_in == 0) { - ress->srcBufferLoaded = fread(ress->srcBuffer, 1, ress->srcBufferSize, srcFile); - if (ress->srcBufferLoaded == 0) flush = Z_FINISH; - strm.next_in = (z_const unsigned char*)ress->srcBuffer; - strm.avail_in = (uInt)ress->srcBufferLoaded; + AIO_ReadPool_consumeAndRefill(ress->readCtx); + if (ress->readCtx->srcBufferLoaded == 0) flush = Z_FINISH; + strm.next_in = (z_const unsigned char*)ress->readCtx->srcBuffer; + strm.avail_in = (uInt)ress->readCtx->srcBufferLoaded; } ret = inflate(&strm, flush); if (ret == Z_BUF_ERROR) { @@ -2177,7 +2157,7 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, const char* srcFileName) if (ret == Z_STREAM_END) break; } - FIO_consumeDSrcBuffer(ress, ress->srcBufferLoaded - strm.avail_in); + AIO_ReadPool_consumeBytes(ress->readCtx, ress->readCtx->srcBufferLoaded - strm.avail_in); if ( (inflateEnd(&strm) != Z_OK) /* release resources ; error detected */ && (decodingError==0) ) { @@ -2192,7 +2172,7 @@ FIO_decompressGzFrame(dRess_t* ress, FILE* srcFile, const char* srcFileName) #ifdef ZSTD_LZMADECOMPRESS static unsigned long long -FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, +FIO_decompressLzmaFrame(dRess_t* ress, const char* srcFileName, int plain_lzma) { unsigned long long outFileSize = 0; @@ -2220,16 +2200,16 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, writeJob = AIO_WritePool_acquireJob(ress->writeCtx); strm.next_out = (Bytef*)writeJob->buffer; strm.avail_out = (uInt)writeJob->bufferSize; - strm.next_in = (BYTE const*)ress->srcBuffer; - strm.avail_in = ress->srcBufferLoaded; + strm.next_in = (BYTE const*)ress->readCtx->srcBuffer; + strm.avail_in = ress->readCtx->srcBufferLoaded; for ( ; ; ) { lzma_ret ret; if (strm.avail_in == 0) { - ress->srcBufferLoaded = fread(ress->srcBuffer, 1, ress->srcBufferSize, srcFile); - if (ress->srcBufferLoaded == 0) action = LZMA_FINISH; - strm.next_in = (BYTE const*)ress->srcBuffer; - strm.avail_in = ress->srcBufferLoaded; + AIO_ReadPool_consumeAndRefill(ress->readCtx); + if (ress->readCtx->srcBufferLoaded == 0) action = LZMA_FINISH; + strm.next_in = (BYTE const*)ress->readCtx->srcBuffer; + strm.avail_in = ress->readCtx->srcBufferLoaded; } ret = lzma_code(&strm, action); @@ -2253,7 +2233,7 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, if (ret == LZMA_STREAM_END) break; } - FIO_consumeDSrcBuffer(ress, ress->srcBufferLoaded - strm.avail_in); + AIO_ReadPool_consumeBytes(ress->readCtx, ress->readCtx->srcBufferLoaded - strm.avail_in); lzma_end(&strm); AIO_WritePool_releaseIoJob(writeJob); AIO_WritePool_sparseWriteEnd(ress->writeCtx); @@ -2263,8 +2243,7 @@ FIO_decompressLzmaFrame(dRess_t* ress, FILE* srcFile, #ifdef ZSTD_LZ4DECOMPRESS static unsigned long long -FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, - const char* srcFileName) +FIO_decompressLz4Frame(dRess_t* ress, const char* srcFileName) { unsigned long long filesize = 0; LZ4F_errorCode_t nextToLoad = 4; @@ -2282,34 +2261,27 @@ FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, /* Main Loop */ for (;nextToLoad;) { - size_t readSize; size_t pos = 0; size_t decodedBytes = writeJob->bufferSize; int fullBufferDecoded = 0; /* Read input */ - nextToLoad = MIN(nextToLoad, ress->srcBufferSize-ress->srcBufferLoaded); - readSize = fread((char *)ress->srcBuffer + ress->srcBufferLoaded, 1, nextToLoad, srcFile); - if(!readSize && ferror(srcFile)) { - DISPLAYLEVEL(1, "zstd: %s: read error \n", srcFileName); - decodingError=1; - break; - } - if(!readSize && !ress->srcBufferLoaded) break; /* reached end of file */ - ress->srcBufferLoaded += readSize; + AIO_ReadPool_fillBuffer(ress->readCtx, nextToLoad); + if(!ress->readCtx->srcBufferLoaded) break; /* reached end of file */ - while ((pos < ress->srcBufferLoaded) || fullBufferDecoded) { /* still to read, or still to flush */ + while ((pos < ress->readCtx->srcBufferLoaded) || fullBufferDecoded) { /* still to read, or still to flush */ /* Decode Input (at least partially) */ - size_t remaining = ress->srcBufferLoaded - pos; + size_t remaining = ress->readCtx->srcBufferLoaded - pos; decodedBytes = writeJob->bufferSize; - nextToLoad = LZ4F_decompress(dCtx, writeJob->buffer, &decodedBytes, (char*)(ress->srcBuffer)+pos, &remaining, NULL); + nextToLoad = LZ4F_decompress(dCtx, writeJob->buffer, &decodedBytes, (char*)(ress->readCtx->srcBuffer)+pos, + &remaining, NULL); if (LZ4F_isError(nextToLoad)) { DISPLAYLEVEL(1, "zstd: %s: lz4 decompression error : %s \n", srcFileName, LZ4F_getErrorName(nextToLoad)); decodingError = 1; nextToLoad = 0; break; } pos += remaining; - assert(pos <= ress->srcBufferLoaded); + assert(pos <= ress->readCtx->srcBufferLoaded); fullBufferDecoded = decodedBytes == writeJob->bufferSize; /* Write Block */ @@ -2324,7 +2296,7 @@ FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, if (!nextToLoad) break; } - FIO_consumeDSrcBuffer(ress, pos); + AIO_ReadPool_consumeBytes(ress->readCtx, pos); } if (nextToLoad!=0) { DISPLAYLEVEL(1, "zstd: %s: unfinished lz4 stream \n", srcFileName); @@ -2348,23 +2320,20 @@ FIO_decompressLz4Frame(dRess_t* ress, FILE* srcFile, * 1 : error */ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, - dRess_t ress, FILE* srcFile, - const FIO_prefs_t* const prefs, - const char* dstFileName, const char* srcFileName) + dRess_t ress, const FIO_prefs_t* const prefs, + const char* dstFileName, const char* srcFileName) { unsigned readSomething = 0; unsigned long long filesize = 0; - assert(srcFile != NULL); /* for each frame */ for ( ; ; ) { /* check magic number -> version */ size_t const toRead = 4; - const BYTE* const buf = (const BYTE*)ress.srcBuffer; - if (ress.srcBufferLoaded < toRead) /* load up to 4 bytes for header */ - ress.srcBufferLoaded += fread((char*)ress.srcBuffer + ress.srcBufferLoaded, - (size_t)1, toRead - ress.srcBufferLoaded, srcFile); - if (ress.srcBufferLoaded==0) { + const BYTE* buf; + AIO_ReadPool_fillBuffer(ress.readCtx, toRead); + buf = (const BYTE*)ress.readCtx->srcBuffer; + if (ress.readCtx->srcBufferLoaded==0) { if (readSomething==0) { /* srcFile is empty (which is invalid) */ DISPLAYLEVEL(1, "zstd: %s: unexpected end of file \n", srcFileName); return 1; @@ -2372,17 +2341,17 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, break; /* no more input */ } readSomething = 1; /* there is at least 1 byte in srcFile */ - if (ress.srcBufferLoaded < toRead) { + if (ress.readCtx->srcBufferLoaded < toRead) { DISPLAYLEVEL(1, "zstd: %s: unknown header \n", srcFileName); return 1; } - if (ZSTD_isFrame(buf, ress.srcBufferLoaded)) { - unsigned long long const frameSize = FIO_decompressZstdFrame(fCtx, &ress, srcFile, prefs, srcFileName, filesize); + if (ZSTD_isFrame(buf, ress.readCtx->srcBufferLoaded)) { + unsigned long long const frameSize = FIO_decompressZstdFrame(fCtx, &ress, prefs, srcFileName, filesize); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; } else if (buf[0] == 31 && buf[1] == 139) { /* gz magic number */ #ifdef ZSTD_GZDECOMPRESS - unsigned long long const frameSize = FIO_decompressGzFrame(&ress, srcFile, srcFileName); + unsigned long long const frameSize = FIO_decompressGzFrame(&ress, srcFileName); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; #else @@ -2392,7 +2361,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, } else if ((buf[0] == 0xFD && buf[1] == 0x37) /* xz magic number */ || (buf[0] == 0x5D && buf[1] == 0x00)) { /* lzma header (no magic number) */ #ifdef ZSTD_LZMADECOMPRESS - unsigned long long const frameSize = FIO_decompressLzmaFrame(&ress, srcFile, srcFileName, buf[0] != 0xFD); + unsigned long long const frameSize = FIO_decompressLzmaFrame(&ress, srcFileName, buf[0] != 0xFD); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; #else @@ -2401,7 +2370,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, #endif } else if (MEM_readLE32(buf) == LZ4_MAGICNUMBER) { #ifdef ZSTD_LZ4DECOMPRESS - unsigned long long const frameSize = FIO_decompressLz4Frame(&ress, srcFile, srcFileName); + unsigned long long const frameSize = FIO_decompressLz4Frame(&ress, srcFileName); if (frameSize == FIO_ERROR_FRAME_DECODING) return 1; filesize += frameSize; #else @@ -2409,10 +2378,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, return 1; #endif } else if ((prefs->overwrite) && !strcmp (dstFileName, stdoutmark)) { /* pass-through mode */ - return FIO_passThrough(prefs, - AIO_WritePool_getFile(ress.writeCtx), srcFile, - ress.srcBuffer, ress.srcBufferSize, - ress.srcBufferLoaded); + return FIO_passThrough(&ress); } else { DISPLAYLEVEL(1, "zstd: %s: unsupported format \n", srcFileName); return 1; @@ -2432,15 +2398,14 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, } /** FIO_decompressDstFile() : - open `dstFileName`, - or path-through if ress.dstFile is already != 0, + open `dstFileName`, or pass-through if writeCtx's file is already != 0, then start decompression process (FIO_decompressFrames()). @return : 0 : OK 1 : operation aborted */ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs, - dRess_t ress, FILE* srcFile, + dRess_t ress, const char* dstFileName, const char* srcFileName) { int result; @@ -2472,7 +2437,7 @@ static int FIO_decompressDstFile(FIO_ctx_t* const fCtx, addHandler(dstFileName); } - result = FIO_decompressFrames(fCtx, ress, srcFile, prefs, dstFileName, srcFileName); + result = FIO_decompressFrames(fCtx, ress, prefs, dstFileName, srcFileName); if (releaseDstFile) { clearHandler(); @@ -2513,9 +2478,11 @@ static int FIO_decompressSrcFile(FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs srcFile = FIO_openSrcFile(prefs, srcFileName); if (srcFile==NULL) return 1; - ress.srcBufferLoaded = 0; + AIO_ReadPool_setFile(ress.readCtx, srcFile); - result = FIO_decompressDstFile(fCtx, prefs, ress, srcFile, dstFileName, srcFileName); + result = FIO_decompressDstFile(fCtx, prefs, ress, dstFileName, srcFileName); + + AIO_ReadPool_setFile(ress.readCtx, NULL); /* Close file */ if (fclose(srcFile)) { diff --git a/programs/fileio_asyncio.c b/programs/fileio_asyncio.c index 868720a1d..332292bbc 100644 --- a/programs/fileio_asyncio.c +++ b/programs/fileio_asyncio.c @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Facebook, Inc. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -29,7 +29,8 @@ /** AIO_fwriteSparse() : * @return : storedSkips, * argument for next call to AIO_fwriteSparse() or AIO_fwriteSparseEnd() */ -unsigned AIO_fwriteSparse(FILE* file, +static unsigned +AIO_fwriteSparse(FILE* file, const void* buffer, size_t bufferSize, const FIO_prefs_t* const prefs, unsigned storedSkips) @@ -45,7 +46,7 @@ unsigned AIO_fwriteSparse(FILE* file, if (!prefs->sparseFileSupport) { /* normal write */ size_t const sizeCheck = fwrite(buffer, 1, bufferSize, file); if (sizeCheck != bufferSize) - EXM_THROW(70, "Write error : cannot write decoded block : %s", + EXM_THROW(70, "Write error : cannot write block : %s", strerror(errno)); return 0; } @@ -77,7 +78,7 @@ unsigned AIO_fwriteSparse(FILE* file, storedSkips = 0; /* write the rest */ if (fwrite(ptrT + nb0T, sizeof(size_t), nbNon0ST, file) != nbNon0ST) - EXM_THROW(93, "Write error : cannot write decoded block : %s", + EXM_THROW(93, "Write error : cannot write block : %s", strerror(errno)); } ptrT += seg0SizeT; @@ -106,7 +107,8 @@ unsigned AIO_fwriteSparse(FILE* file, return storedSkips; } -void AIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned storedSkips) +static void +AIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned storedSkips) { if (prefs->testMode) assert(storedSkips == 0); if (storedSkips>0) { @@ -127,17 +129,25 @@ void AIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned st * AsyncIO functionality ************************************************************************/ +/* AIO_supported: + * Returns 1 if AsyncIO is supported on the system, 0 otherwise. */ +int AIO_supported(void) { +#ifdef ZSTD_MULTITHREAD + return 1; +#else + return 0; +#endif +} + /* *********************************** * General IoPool implementation *************************************/ static IOJob_t *AIO_IOPool_createIoJob(IOPoolCtx_t *ctx, size_t bufferSize) { - void *buffer; - IOJob_t *job; - job = (IOJob_t*) malloc(sizeof(IOJob_t)); - buffer = malloc(bufferSize); + IOJob_t* const job = (IOJob_t*) malloc(sizeof(IOJob_t)); + void* const buffer = malloc(bufferSize); if(!job || !buffer) - EXM_THROW(101, "Allocation error : not enough memory"); + EXM_THROW(101, "Allocation error : not enough memory"); job->buffer = buffer; job->bufferSize = bufferSize; job->usedBufferSize = 0; @@ -151,49 +161,47 @@ static IOJob_t *AIO_IOPool_createIoJob(IOPoolCtx_t *ctx, size_t bufferSize) { /* AIO_IOPool_createThreadPool: * Creates a thread pool and a mutex for threaded IO pool. * Displays warning if asyncio is requested but MT isn't available. */ -static void AIO_IOPool_createThreadPool(IOPoolCtx_t *ctx, const FIO_prefs_t *prefs) { +static void AIO_IOPool_createThreadPool(IOPoolCtx_t* ctx, const FIO_prefs_t* prefs) { ctx->threadPool = NULL; if(prefs->asyncIO) { if (ZSTD_pthread_mutex_init(&ctx->ioJobsMutex, NULL)) - EXM_THROW(102,"Failed creating write availableJobs mutex"); + EXM_THROW(102,"Failed creating write availableJobs mutex"); /* We want MAX_IO_JOBS-2 queue items because we need to always have 1 free buffer to * decompress into and 1 buffer that's actively written to disk and owned by the writing thread. */ assert(MAX_IO_JOBS >= 2); ctx->threadPool = POOL_create(1, MAX_IO_JOBS - 2); if (!ctx->threadPool) - EXM_THROW(104, "Failed creating writer thread pool"); + EXM_THROW(104, "Failed creating writer thread pool"); } } /* AIO_IOPool_init: * Allocates and sets and a new write pool including its included availableJobs. */ -static void AIO_IOPool_init(IOPoolCtx_t *ctx, FIO_prefs_t* const prefs, POOL_function poolFunction, size_t bufferSize) { +static void AIO_IOPool_init(IOPoolCtx_t* ctx, const FIO_prefs_t* prefs, POOL_function poolFunction, size_t bufferSize) { int i; AIO_IOPool_createThreadPool(ctx, prefs); ctx->prefs = prefs; ctx->poolFunction = poolFunction; - ctx->totalIoJobs = ctx->threadPool ? MAX_IO_JOBS : 1; + ctx->totalIoJobs = ctx->threadPool ? MAX_IO_JOBS : 2; ctx->availableJobsCount = ctx->totalIoJobs; for(i=0; i < ctx->availableJobsCount; i++) { ctx->availableJobs[i] = AIO_IOPool_createIoJob(ctx, bufferSize); } + ctx->jobBufferSize = bufferSize; ctx->file = NULL; } /* AIO_IOPool_releaseIoJob: * Releases an acquired job back to the pool. Doesn't execute the job. */ -static void AIO_IOPool_releaseIoJob(IOJob_t *job) { - IOPoolCtx_t *ctx = (IOPoolCtx_t *) job->ctx; - if(ctx->threadPool) { +static void AIO_IOPool_releaseIoJob(IOJob_t* job) { + IOPoolCtx_t* const ctx = (IOPoolCtx_t *) job->ctx; + if(ctx->threadPool) ZSTD_pthread_mutex_lock(&ctx->ioJobsMutex); - assert(ctx->availableJobsCount < MAX_IO_JOBS); - ctx->availableJobs[ctx->availableJobsCount++] = job; + assert(ctx->availableJobsCount < ctx->totalIoJobs); + ctx->availableJobs[ctx->availableJobsCount++] = job; + if(ctx->threadPool) ZSTD_pthread_mutex_unlock(&ctx->ioJobsMutex); - } else { - assert(ctx->availableJobsCount == 0); - ctx->availableJobsCount++; - } } /* AIO_IOPool_join: @@ -225,19 +233,15 @@ static void AIO_IOPool_destroy(IOPoolCtx_t* ctx) { /* AIO_IOPool_acquireJob: * Returns an available io job to be used for a future io. */ -static IOJob_t* AIO_IOPool_acquireJob(IOPoolCtx_t *ctx) { +static IOJob_t* AIO_IOPool_acquireJob(IOPoolCtx_t* ctx) { IOJob_t *job; assert(ctx->file != NULL || ctx->prefs->testMode); - if(ctx->threadPool) { + if(ctx->threadPool) ZSTD_pthread_mutex_lock(&ctx->ioJobsMutex); - assert(ctx->availableJobsCount > 0); - job = (IOJob_t*) ctx->availableJobs[--ctx->availableJobsCount]; + assert(ctx->availableJobsCount > 0); + job = (IOJob_t*) ctx->availableJobs[--ctx->availableJobsCount]; + if(ctx->threadPool) ZSTD_pthread_mutex_unlock(&ctx->ioJobsMutex); - } else { - assert(ctx->availableJobsCount == 1); - ctx->availableJobsCount--; - job = (IOJob_t*)ctx->availableJobs[0]; - } job->usedBufferSize = 0; job->file = ctx->file; job->offset = 0; @@ -249,22 +253,22 @@ static IOJob_t* AIO_IOPool_acquireJob(IOPoolCtx_t *ctx) { * Sets the destination file for future files in the pool. * Requires completion of all queues write jobs and release of all otherwise acquired jobs. * Also requires ending of sparse write if a previous file was used in sparse mode. */ -static void AIO_IOPool_setFile(IOPoolCtx_t *ctx, FILE* file) { +static void AIO_IOPool_setFile(IOPoolCtx_t* ctx, FILE* file) { assert(ctx!=NULL); AIO_IOPool_join(ctx); assert(ctx->availableJobsCount == ctx->totalIoJobs); ctx->file = file; } -static FILE* AIO_IOPool_getFile(IOPoolCtx_t *ctx) { +static FILE* AIO_IOPool_getFile(const IOPoolCtx_t* ctx) { return ctx->file; } /* AIO_IOPool_enqueueJob: * Enqueues an io job for execution. * The queued job shouldn't be used directly after queueing it. */ -static void AIO_IOPool_enqueueJob(IOJob_t *job) { - IOPoolCtx_t* ctx = (IOPoolCtx_t *)job->ctx; +static void AIO_IOPool_enqueueJob(IOJob_t* job) { + IOPoolCtx_t* const ctx = (IOPoolCtx_t *)job->ctx; if(ctx->threadPool) POOL_add(ctx->threadPool, ctx->poolFunction, job); else @@ -277,7 +281,7 @@ static void AIO_IOPool_enqueueJob(IOJob_t *job) { /* AIO_WritePool_acquireJob: * Returns an available write job to be used for a future write. */ -IOJob_t* AIO_WritePool_acquireJob(WritePoolCtx_t *ctx) { +IOJob_t* AIO_WritePool_acquireJob(WritePoolCtx_t* ctx) { return AIO_IOPool_acquireJob(&ctx->base); } @@ -294,7 +298,7 @@ void AIO_WritePool_enqueueAndReacquireWriteJob(IOJob_t **job) { /* AIO_WritePool_sparseWriteEnd: * Ends sparse writes to the current file. * Blocks on completion of all current write jobs before executing. */ -void AIO_WritePool_sparseWriteEnd(WritePoolCtx_t *ctx) { +void AIO_WritePool_sparseWriteEnd(WritePoolCtx_t* ctx) { assert(ctx != NULL); if(ctx->base.threadPool) POOL_joinJobs(ctx->base.threadPool); @@ -306,28 +310,28 @@ void AIO_WritePool_sparseWriteEnd(WritePoolCtx_t *ctx) { * Sets the destination file for future writes in the pool. * Requires completion of all queues write jobs and release of all otherwise acquired jobs. * Also requires ending of sparse write if a previous file was used in sparse mode. */ -void AIO_WritePool_setFile(WritePoolCtx_t *ctx, FILE* file) { +void AIO_WritePool_setFile(WritePoolCtx_t* ctx, FILE* file) { AIO_IOPool_setFile(&ctx->base, file); assert(ctx->storedSkips == 0); } /* AIO_WritePool_getFile: * Returns the file the writePool is currently set to write to. */ -FILE* AIO_WritePool_getFile(WritePoolCtx_t *ctx) { +FILE* AIO_WritePool_getFile(const WritePoolCtx_t* ctx) { return AIO_IOPool_getFile(&ctx->base); } /* AIO_WritePool_releaseIoJob: * Releases an acquired job back to the pool. Doesn't execute the job. */ -void AIO_WritePool_releaseIoJob(IOJob_t *job) { +void AIO_WritePool_releaseIoJob(IOJob_t* job) { AIO_IOPool_releaseIoJob(job); } /* AIO_WritePool_closeFile: * Ends sparse write and closes the writePool's current file and sets the file to NULL. * Requires completion of all queues write jobs and release of all otherwise acquired jobs. */ -int AIO_WritePool_closeFile(WritePoolCtx_t *ctx) { - FILE *dstFile = ctx->base.file; +int AIO_WritePool_closeFile(WritePoolCtx_t* ctx) { + FILE* const dstFile = ctx->base.file; assert(dstFile!=NULL || ctx->base.prefs->testMode!=0); AIO_WritePool_sparseWriteEnd(ctx); AIO_IOPool_setFile(&ctx->base, NULL); @@ -337,16 +341,16 @@ int AIO_WritePool_closeFile(WritePoolCtx_t *ctx) { /* AIO_WritePool_executeWriteJob: * Executes a write job synchronously. Can be used as a function for a thread pool. */ static void AIO_WritePool_executeWriteJob(void* opaque){ - IOJob_t* job = (IOJob_t*) opaque; - WritePoolCtx_t* ctx = (WritePoolCtx_t*) job->ctx; + IOJob_t* const job = (IOJob_t*) opaque; + WritePoolCtx_t* const ctx = (WritePoolCtx_t*) job->ctx; ctx->storedSkips = AIO_fwriteSparse(job->file, job->buffer, job->usedBufferSize, ctx->base.prefs, ctx->storedSkips); AIO_IOPool_releaseIoJob(job); } /* AIO_WritePool_create: * Allocates and sets and a new write pool including its included jobs. */ -WritePoolCtx_t* AIO_WritePool_create(FIO_prefs_t* const prefs, size_t bufferSize) { - WritePoolCtx_t* ctx = (WritePoolCtx_t*) malloc(sizeof(WritePoolCtx_t)); +WritePoolCtx_t* AIO_WritePool_create(const FIO_prefs_t* prefs, size_t bufferSize) { + WritePoolCtx_t* const ctx = (WritePoolCtx_t*) malloc(sizeof(WritePoolCtx_t)); if(!ctx) EXM_THROW(100, "Allocation error : not enough memory"); AIO_IOPool_init(&ctx->base, prefs, AIO_WritePool_executeWriteJob, bufferSize); ctx->storedSkips = 0; @@ -363,3 +367,256 @@ void AIO_WritePool_free(WritePoolCtx_t* ctx) { assert(ctx->storedSkips==0); free(ctx); } + + +/* *********************************** + * ReadPool implementation + *************************************/ +static void AIO_ReadPool_releaseAllCompletedJobs(ReadPoolCtx_t* ctx) { + int i; + for(i=0; icompletedJobsCount; i++) { + IOJob_t* job = (IOJob_t*) ctx->completedJobs[i]; + AIO_IOPool_releaseIoJob(job); + } + ctx->completedJobsCount = 0; +} + +static void AIO_ReadPool_addJobToCompleted(IOJob_t* job) { + ReadPoolCtx_t* const ctx = (ReadPoolCtx_t *)job->ctx; + if(ctx->base.threadPool) + ZSTD_pthread_mutex_lock(&ctx->base.ioJobsMutex); + assert(ctx->completedJobsCount < MAX_IO_JOBS); + ctx->completedJobs[ctx->completedJobsCount++] = job; + if(ctx->base.threadPool) { + ZSTD_pthread_cond_signal(&ctx->jobCompletedCond); + ZSTD_pthread_mutex_unlock(&ctx->base.ioJobsMutex); + } +} + +/* AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked: + * Looks through the completed jobs for a job matching the waitingOnOffset and returns it, + * if job wasn't found returns NULL. + * IMPORTANT: assumes ioJobsMutex is locked. */ +static IOJob_t* AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked(ReadPoolCtx_t* ctx) { + IOJob_t *job = NULL; + int i; + /* This implementation goes through all completed jobs and looks for the one matching the next offset. + * While not strictly needed for a single threaded reader implementation (as in such a case we could expect + * reads to be completed in order) this implementation was chosen as it better fits other asyncio + * interfaces (such as io_uring) that do not provide promises regarding order of completion. */ + for (i=0; icompletedJobsCount; i++) { + job = (IOJob_t *) ctx->completedJobs[i]; + if (job->offset == ctx->waitingOnOffset) { + ctx->completedJobs[i] = ctx->completedJobs[--ctx->completedJobsCount]; + return job; + } + } + return NULL; +} + +/* AIO_ReadPool_numReadsInFlight: + * Returns the number of IO read jobs currrently in flight. */ +static size_t AIO_ReadPool_numReadsInFlight(ReadPoolCtx_t* ctx) { + const size_t jobsHeld = (ctx->currentJobHeld==NULL ? 0 : 1); + return ctx->base.totalIoJobs - (ctx->base.availableJobsCount + ctx->completedJobsCount + jobsHeld); +} + +/* AIO_ReadPool_getNextCompletedJob: + * Returns a completed IOJob_t for the next read in line based on waitingOnOffset and advances waitingOnOffset. + * Would block. */ +static IOJob_t* AIO_ReadPool_getNextCompletedJob(ReadPoolCtx_t* ctx) { + IOJob_t *job = NULL; + if (ctx->base.threadPool) + ZSTD_pthread_mutex_lock(&ctx->base.ioJobsMutex); + + job = AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked(ctx); + + /* As long as we didn't find the job matching the next read, and we have some reads in flight continue waiting */ + while (!job && (AIO_ReadPool_numReadsInFlight(ctx) > 0)) { + assert(ctx->base.threadPool != NULL); /* we shouldn't be here if we work in sync mode */ + ZSTD_pthread_cond_wait(&ctx->jobCompletedCond, &ctx->base.ioJobsMutex); + job = AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked(ctx); + } + + if(job) { + assert(job->offset == ctx->waitingOnOffset); + ctx->waitingOnOffset += job->usedBufferSize; + } + + if (ctx->base.threadPool) + ZSTD_pthread_mutex_unlock(&ctx->base.ioJobsMutex); + return job; +} + + +/* AIO_ReadPool_executeReadJob: + * Executes a read job synchronously. Can be used as a function for a thread pool. */ +static void AIO_ReadPool_executeReadJob(void* opaque){ + IOJob_t* const job = (IOJob_t*) opaque; + ReadPoolCtx_t* const ctx = (ReadPoolCtx_t *)job->ctx; + if(ctx->reachedEof) { + job->usedBufferSize = 0; + AIO_ReadPool_addJobToCompleted(job); + return; + } + job->usedBufferSize = fread(job->buffer, 1, job->bufferSize, job->file); + if(job->usedBufferSize < job->bufferSize) { + if(ferror(job->file)) { + EXM_THROW(37, "Read error"); + } else if(feof(job->file)) { + ctx->reachedEof = 1; + } else { + EXM_THROW(37, "Unexpected short read"); + } + } + AIO_ReadPool_addJobToCompleted(job); +} + +static void AIO_ReadPool_enqueueRead(ReadPoolCtx_t* ctx) { + IOJob_t* const job = AIO_IOPool_acquireJob(&ctx->base); + job->offset = ctx->nextReadOffset; + ctx->nextReadOffset += job->bufferSize; + AIO_IOPool_enqueueJob(job); +} + +static void AIO_ReadPool_startReading(ReadPoolCtx_t* ctx) { + int i; + for (i = 0; i < ctx->base.availableJobsCount; i++) { + AIO_ReadPool_enqueueRead(ctx); + } +} + +/* AIO_ReadPool_setFile: + * Sets the source file for future read in the pool. Initiates reading immediately if file is not NULL. + * Waits for all current enqueued tasks to complete if a previous file was set. */ +void AIO_ReadPool_setFile(ReadPoolCtx_t* ctx, FILE* file) { + assert(ctx!=NULL); + AIO_IOPool_join(&ctx->base); + AIO_ReadPool_releaseAllCompletedJobs(ctx); + if (ctx->currentJobHeld) { + AIO_IOPool_releaseIoJob((IOJob_t *)ctx->currentJobHeld); + ctx->currentJobHeld = NULL; + } + AIO_IOPool_setFile(&ctx->base, file); + ctx->nextReadOffset = 0; + ctx->waitingOnOffset = 0; + ctx->srcBuffer = ctx->coalesceBuffer; + ctx->srcBufferLoaded = 0; + ctx->reachedEof = 0; + if(file != NULL) + AIO_ReadPool_startReading(ctx); +} + +/* AIO_ReadPool_create: + * Allocates and sets and a new readPool including its included jobs. + * bufferSize should be set to the maximal buffer we want to read at a time, will also be used + * as our basic read size. */ +ReadPoolCtx_t* AIO_ReadPool_create(const FIO_prefs_t* prefs, size_t bufferSize) { + ReadPoolCtx_t* const ctx = (ReadPoolCtx_t*) malloc(sizeof(ReadPoolCtx_t)); + if(!ctx) EXM_THROW(100, "Allocation error : not enough memory"); + AIO_IOPool_init(&ctx->base, prefs, AIO_ReadPool_executeReadJob, bufferSize); + + ctx->coalesceBuffer = (U8*) malloc(bufferSize * 2); + ctx->srcBuffer = ctx->coalesceBuffer; + ctx->srcBufferLoaded = 0; + ctx->completedJobsCount = 0; + ctx->currentJobHeld = NULL; + + if(ctx->base.threadPool) + if (ZSTD_pthread_cond_init(&ctx->jobCompletedCond, NULL)) + EXM_THROW(103,"Failed creating write jobCompletedCond mutex"); + + return ctx; +} + +/* AIO_ReadPool_free: + * Frees and releases a readPool and its resources. Closes source file. */ +void AIO_ReadPool_free(ReadPoolCtx_t* ctx) { + if(AIO_ReadPool_getFile(ctx)) + AIO_ReadPool_closeFile(ctx); + if(ctx->base.threadPool) + ZSTD_pthread_cond_destroy(&ctx->jobCompletedCond); + AIO_IOPool_destroy(&ctx->base); + free(ctx->coalesceBuffer); + free(ctx); +} + +/* AIO_ReadPool_consumeBytes: + * Consumes byes from srcBuffer's beginning and updates srcBufferLoaded accordingly. */ +void AIO_ReadPool_consumeBytes(ReadPoolCtx_t* ctx, size_t n) { + assert(n <= ctx->srcBufferLoaded); + ctx->srcBufferLoaded -= n; + ctx->srcBuffer += n; +} + +/* AIO_ReadPool_releaseCurrentlyHeldAndGetNext: + * Release the current held job and get the next one, returns NULL if no next job available. */ +static IOJob_t* AIO_ReadPool_releaseCurrentHeldAndGetNext(ReadPoolCtx_t* ctx) { + if (ctx->currentJobHeld) { + AIO_IOPool_releaseIoJob((IOJob_t *)ctx->currentJobHeld); + ctx->currentJobHeld = NULL; + AIO_ReadPool_enqueueRead(ctx); + } + ctx->currentJobHeld = AIO_ReadPool_getNextCompletedJob(ctx); + return (IOJob_t*) ctx->currentJobHeld; +} + +/* AIO_ReadPool_fillBuffer: + * Tries to fill the buffer with at least n or jobBufferSize bytes (whichever is smaller). + * Returns if srcBuffer has at least the expected number of bytes loaded or if we've reached the end of the file. + * Return value is the number of bytes added to the buffer. + * Note that srcBuffer might have up to 2 times jobBufferSize bytes. */ +size_t AIO_ReadPool_fillBuffer(ReadPoolCtx_t* ctx, size_t n) { + IOJob_t *job; + int useCoalesce = 0; + if(n > ctx->base.jobBufferSize) + n = ctx->base.jobBufferSize; + + /* We are good, don't read anything */ + if (ctx->srcBufferLoaded >= n) + return 0; + + /* We still have bytes loaded, but not enough to satisfy caller. We need to get the next job + * and coalesce the remaining bytes with the next job's buffer */ + if (ctx->srcBufferLoaded > 0) { + useCoalesce = 1; + memcpy(ctx->coalesceBuffer, ctx->srcBuffer, ctx->srcBufferLoaded); + ctx->srcBuffer = ctx->coalesceBuffer; + } + + /* Read the next chunk */ + job = AIO_ReadPool_releaseCurrentHeldAndGetNext(ctx); + if(!job) + return 0; + if(useCoalesce) { + assert(ctx->srcBufferLoaded + job->usedBufferSize <= 2*ctx->base.jobBufferSize); + memcpy(ctx->coalesceBuffer + ctx->srcBufferLoaded, job->buffer, job->usedBufferSize); + ctx->srcBufferLoaded += job->usedBufferSize; + } + else { + ctx->srcBuffer = (U8 *) job->buffer; + ctx->srcBufferLoaded = job->usedBufferSize; + } + return job->usedBufferSize; +} + +/* AIO_ReadPool_consumeAndRefill: + * Consumes the current buffer and refills it with bufferSize bytes. */ +size_t AIO_ReadPool_consumeAndRefill(ReadPoolCtx_t* ctx) { + AIO_ReadPool_consumeBytes(ctx, ctx->srcBufferLoaded); + return AIO_ReadPool_fillBuffer(ctx, ctx->base.jobBufferSize); +} + +/* AIO_ReadPool_getFile: + * Returns the current file set for the read pool. */ +FILE* AIO_ReadPool_getFile(const ReadPoolCtx_t* ctx) { + return AIO_IOPool_getFile(&ctx->base); +} + +/* AIO_ReadPool_closeFile: + * Closes the current set file. Waits for all current enqueued tasks to complete and resets state. */ +int AIO_ReadPool_closeFile(ReadPoolCtx_t* ctx) { + FILE* const file = AIO_ReadPool_getFile(ctx); + AIO_ReadPool_setFile(ctx, NULL); + return fclose(file); +} diff --git a/programs/fileio_asyncio.h b/programs/fileio_asyncio.h index 3e91164c5..bf07f8594 100644 --- a/programs/fileio_asyncio.h +++ b/programs/fileio_asyncio.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Facebook, Inc. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -28,7 +28,7 @@ typedef struct { /* These struct fields should be set only on creation and not changed afterwards */ POOL_ctx* threadPool; int totalIoJobs; - FIO_prefs_t* prefs; + const FIO_prefs_t* prefs; POOL_function poolFunction; /* Controls the file we currently write to, make changes only by using provided utility functions */ @@ -39,8 +39,36 @@ typedef struct { ZSTD_pthread_mutex_t ioJobsMutex; void* availableJobs[MAX_IO_JOBS]; int availableJobsCount; + size_t jobBufferSize; } IOPoolCtx_t; +typedef struct { + IOPoolCtx_t base; + + /* State regarding the currently read file */ + int reachedEof; + U64 nextReadOffset; + U64 waitingOnOffset; + + /* We may hold an IOJob object as needed if we actively expose its buffer. */ + void *currentJobHeld; + + /* Coalesce buffer is used to join two buffers in case where we need to read more bytes than left in + * the first of them. Shouldn't be accessed from outside ot utility functions. */ + U8 *coalesceBuffer; + + /* Read buffer can be used by consumer code, take care when copying this pointer aside as it might + * change when consuming / refilling buffer. */ + U8 *srcBuffer; + size_t srcBufferLoaded; + + /* We need to know what tasks completed so we can use their buffers when their time comes. + * Should only be accessed after locking base.ioJobsMutex . */ + void* completedJobs[MAX_IO_JOBS]; + int completedJobsCount; + ZSTD_pthread_cond_t jobCompletedCond; +} ReadPoolCtx_t; + typedef struct { IOPoolCtx_t base; unsigned storedSkips; @@ -59,15 +87,10 @@ typedef struct { U64 offset; } IOJob_t; -/** AIO_fwriteSparse() : -* @return : storedSkips, -* argument for next call to AIO_fwriteSparse() or AIO_fwriteSparseEnd() */ -unsigned AIO_fwriteSparse(FILE* file, - const void* buffer, size_t bufferSize, - const FIO_prefs_t* const prefs, - unsigned storedSkips); +/* AIO_supported: + * Returns 1 if AsyncIO is supported on the system, 0 otherwise. */ +int AIO_supported(void); -void AIO_fwriteSparseEnd(const FIO_prefs_t* const prefs, FILE* file, unsigned storedSkips); /* AIO_WritePool_releaseIoJob: * Releases an acquired job back to the pool. Doesn't execute the job. */ @@ -97,7 +120,7 @@ void AIO_WritePool_setFile(WritePoolCtx_t *ctx, FILE* file); /* AIO_WritePool_getFile: * Returns the file the writePool is currently set to write to. */ -FILE* AIO_WritePool_getFile(WritePoolCtx_t *ctx); +FILE* AIO_WritePool_getFile(const WritePoolCtx_t* ctx); /* AIO_WritePool_closeFile: * Ends sparse write and closes the writePool's current file and sets the file to NULL. @@ -107,12 +130,50 @@ int AIO_WritePool_closeFile(WritePoolCtx_t *ctx); /* AIO_WritePool_create: * Allocates and sets and a new write pool including its included jobs. * bufferSize should be set to the maximal buffer we want to write to at a time. */ -WritePoolCtx_t* AIO_WritePool_create(FIO_prefs_t* const prefs, size_t bufferSize); +WritePoolCtx_t* AIO_WritePool_create(const FIO_prefs_t* prefs, size_t bufferSize); /* AIO_WritePool_free: * Frees and releases a writePool and its resources. Closes destination file. */ void AIO_WritePool_free(WritePoolCtx_t* ctx); +/* AIO_ReadPool_create: + * Allocates and sets and a new readPool including its included jobs. + * bufferSize should be set to the maximal buffer we want to read at a time, will also be used + * as our basic read size. */ +ReadPoolCtx_t* AIO_ReadPool_create(const FIO_prefs_t* prefs, size_t bufferSize); + +/* AIO_ReadPool_free: + * Frees and releases a readPool and its resources. Closes source file. */ +void AIO_ReadPool_free(ReadPoolCtx_t* ctx); + +/* AIO_ReadPool_consumeBytes: + * Consumes byes from srcBuffer's beginning and updates srcBufferLoaded accordingly. */ +void AIO_ReadPool_consumeBytes(ReadPoolCtx_t *ctx, size_t n); + +/* AIO_ReadPool_fillBuffer: + * Makes sure buffer has at least n bytes loaded (as long as n is not bigger than the initalized bufferSize). + * Returns if srcBuffer has at least n bytes loaded or if we've reached the end of the file. + * Return value is the number of bytes added to the buffer. + * Note that srcBuffer might have up to 2 times bufferSize bytes. */ +size_t AIO_ReadPool_fillBuffer(ReadPoolCtx_t *ctx, size_t n); + +/* AIO_ReadPool_consumeAndRefill: + * Consumes the current buffer and refills it with bufferSize bytes. */ +size_t AIO_ReadPool_consumeAndRefill(ReadPoolCtx_t *ctx); + +/* AIO_ReadPool_setFile: + * Sets the source file for future read in the pool. Initiates reading immediately if file is not NULL. + * Waits for all current enqueued tasks to complete if a previous file was set. */ +void AIO_ReadPool_setFile(ReadPoolCtx_t *ctx, FILE* file); + +/* AIO_ReadPool_getFile: + * Returns the current file set for the read pool. */ +FILE* AIO_ReadPool_getFile(const ReadPoolCtx_t *ctx); + +/* AIO_ReadPool_closeFile: + * Closes the current set file. Waits for all current enqueued tasks to complete and resets state. */ +int AIO_ReadPool_closeFile(ReadPoolCtx_t *ctx); + #if defined (__cplusplus) } #endif diff --git a/programs/fileio_common.h b/programs/fileio_common.h index d33c19d7b..282c2f13b 100644 --- a/programs/fileio_common.h +++ b/programs/fileio_common.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Facebook, Inc. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the diff --git a/programs/fileio_types.h b/programs/fileio_types.h index 1909ab1ab..cf566aa20 100644 --- a/programs/fileio_types.h +++ b/programs/fileio_types.h @@ -1,5 +1,5 @@ /* - * Copyright (c) Yann Collet, Facebook, Inc. + * Copyright (c) Facebook, Inc. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the @@ -70,4 +70,4 @@ typedef struct FIO_prefs_s { int allowBlockDevices; } FIO_prefs_t; -#endif /* FILEIO_TYPES_HEADER */ \ No newline at end of file +#endif /* FILEIO_TYPES_HEADER */ diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 2e3f4ddb7..29da261df 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -46,6 +46,7 @@ # include "zstdcli_trace.h" #endif #include "../lib/zstd.h" /* ZSTD_VERSION_STRING, ZSTD_minCLevel, ZSTD_maxCLevel */ +#include "fileio_asyncio.h" /*-************************************ @@ -179,7 +180,8 @@ static void usage_advanced(const char* programName) #ifdef UTIL_HAS_MIRRORFILELIST DISPLAYOUT( "--output-dir-mirror DIR : processed files are stored into DIR respecting original directory structure \n"); #endif - + if (AIO_supported()) + DISPLAYOUT( "--[no-]asyncio : use asynchronous IO (default: enabled) \n"); #ifndef ZSTD_NOCOMPRESS DISPLAYOUT( "--[no-]check : during compression, add XXH64 integrity checksum to frame (default: enabled)"); @@ -242,9 +244,6 @@ static void usage_advanced(const char* programName) DISPLAYOUT( " -l : print information about zstd compressed files \n"); DISPLAYOUT( "--test : test compressed file integrity \n"); DISPLAYOUT( " -M# : Set a memory usage limit for decompression \n"); -#ifdef ZSTD_MULTITHREAD - DISPLAYOUT( "--[no-]asyncio : use threaded asynchronous IO for output (default: disabled) \n"); -#endif # if ZSTD_SPARSE_DEFAULT DISPLAYOUT( "--[no-]sparse : sparse mode (default: enabled on file, disabled on stdout) \n"); # else @@ -1459,6 +1458,7 @@ int main(int argCount, const char* argv[]) FIO_setTargetCBlockSize(prefs, targetCBlockSize); FIO_setSrcSizeHint(prefs, srcSizeHint); FIO_setLiteralCompressionMode(prefs, literalCompressionMode); + FIO_setSparseWrite(prefs, 0); if (adaptMin > cLevel) cLevel = adaptMin; if (adaptMax < cLevel) cLevel = adaptMax; diff --git a/tests/playTests.sh b/tests/playTests.sh index f04f1da72..f97e96e37 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -260,10 +260,13 @@ zstd -dc - < tmp.zst > $INTOVOID zstd -d < tmp.zst > $INTOVOID # implicit stdout when stdin is used zstd -d - < tmp.zst > $INTOVOID println "test : impose memory limitation (must fail)" -zstd -d -f tmp.zst -M2K -c > $INTOVOID && die "decompression needs more memory than allowed" -zstd -d -f tmp.zst --memlimit=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command -zstd -d -f tmp.zst --memory=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command -zstd -d -f tmp.zst --memlimit-decompress=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command +datagen -g500K > tmplimit +zstd -f tmplimit +zstd -d -f tmplimit.zst -M2K -c > $INTOVOID && die "decompression needs more memory than allowed" +zstd -d -f tmplimit.zst --memlimit=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command +zstd -d -f tmplimit.zst --memory=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command +zstd -d -f tmplimit.zst --memlimit-decompress=2K -c > $INTOVOID && die "decompression needs more memory than allowed" # long command +rm -f tmplimit tmplimit.zst println "test : overwrite protection" zstd -q tmp && die "overwrite check failed!" println "test : force overwrite" @@ -1596,11 +1599,11 @@ elif [ "$longCSize19wlog23" -gt "$optCSize19wlog23" ]; then exit 1 fi -println "\n===> zstd asyncio decompression tests " +println "\n===> zstd asyncio tests " addFrame() { datagen -g2M -s$2 >> tmp_uncompressed - datagen -g2M -s$2 | zstd --format=$1 >> tmp_compressed.zst + datagen -g2M -s$2 | zstd -1 --format=$1 >> tmp_compressed.zst } addTwoFrames() { From 9a758ce52068b2daffd36a6ae9af16adf5791f14 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 31 Jan 2022 16:17:11 -0800 Subject: [PATCH 075/472] update sequence_compression_api fuzzer test to check for under-sized dstCapacity. --- tests/fuzz/sequence_compression_api.c | 41 ++++++++++++++++----------- tests/fuzz/zstd_helpers.h | 1 + 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/tests/fuzz/sequence_compression_api.c b/tests/fuzz/sequence_compression_api.c index 68923e11e..e01daacaa 100644 --- a/tests/fuzz/sequence_compression_api.c +++ b/tests/fuzz/sequence_compression_api.c @@ -221,11 +221,11 @@ static size_t generateRandomSequences(FUZZ_dataProducer_t* producer, return nbSeqGenerated; } -static size_t roundTripTest(void *result, size_t resultCapacity, - void *compressed, size_t compressedCapacity, - size_t srcSize, - const void *dict, size_t dictSize, - size_t generatedSequencesSize, +static size_t roundTripTest(void* result, size_t resultCapacity, + void* compressed, size_t compressedCapacity, + const void* src, size_t srcSize, + const void* dict, size_t dictSize, + const ZSTD_Sequence* seqs, size_t seqSize, int wLog, int cLevel, unsigned hasDict, ZSTD_sequenceFormat_e mode) { @@ -245,12 +245,22 @@ static size_t roundTripTest(void *result, size_t resultCapacity, } cSize = ZSTD_compressSequences(cctx, compressed, compressedCapacity, - generatedSequences, generatedSequencesSize, - generatedSrc, srcSize); + seqs, seqSize, + src, srcSize); + if ( (ZSTD_getErrorCode(cSize) == ZSTD_error_dstSize_tooSmall) + && (mode == ZSTD_sf_explicitBlockDelimiters) ) { + /* Valid scenario : in explicit delimiter mode, + * it might be possible for the compressed size to outgrow dstCapacity. + * In which case, it's still a valid fuzzer scenario, + * but no roundtrip shall be possible */ + return 0; + } + /* round-trip */ FUZZ_ZASSERT(cSize); dSize = ZSTD_decompressDCtx(dctx, result, resultCapacity, compressed, cSize); FUZZ_ZASSERT(dSize); - + FUZZ_ASSERT_MSG(dSize == srcSize, "Incorrect regenerated size"); + FUZZ_ASSERT_MSG(!FUZZ_memcmp(src, result, srcSize), "Corruption!"); return dSize; } @@ -298,10 +308,11 @@ int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size) nbSequences = generateRandomSequences(producer, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictSize, wLog, mode); generatedSrcSize = decodeSequences(generatedSrc, nbSequences, ZSTD_FUZZ_GENERATED_LITERALS_SIZE, dictBuffer, dictSize, mode); /* Note : in explicit block delimiters mode, - * the fuzzer might generate a lot of small incompressible blocks. + * the fuzzer might generate a lot of small blocks. * In which case, the final compressed size might be > ZSTD_compressBound(). - * Solution : provide a much more generous cBufSize to cover these scenarios */ - cBufSize = (mode == ZSTD_sf_noBlockDelimiters) ? ZSTD_compressBound(generatedSrcSize) : 256 + (generatedSrcSize * 2); + * This is still a valid scenario fuzzer though, which makes it possible to check under-sized dstCapacity. + * The test just doesn't roundtrip. */ + cBufSize = ZSTD_compressBound(generatedSrcSize); cBuf = FUZZ_malloc(cBufSize); rBufSize = generatedSrcSize; @@ -318,14 +329,12 @@ int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size) { const size_t result = roundTripTest(rBuf, rBufSize, cBuf, cBufSize, - generatedSrcSize, + generatedSrc, generatedSrcSize, dictBuffer, dictSize, - nbSequences, + generatedSequences, nbSequences, (int)wLog, cLevel, hasDict, mode); - FUZZ_ZASSERT(result); - FUZZ_ASSERT_MSG(result == generatedSrcSize, "Incorrect regenerated size"); + FUZZ_ASSERT(result <= generatedSrcSize); /* can be 0 when no round-trip */ } - FUZZ_ASSERT_MSG(!FUZZ_memcmp(generatedSrc, rBuf, generatedSrcSize), "Corruption!"); free(rBuf); free(cBuf); diff --git a/tests/fuzz/zstd_helpers.h b/tests/fuzz/zstd_helpers.h index 7813884d3..9fbefdc72 100644 --- a/tests/fuzz/zstd_helpers.h +++ b/tests/fuzz/zstd_helpers.h @@ -17,6 +17,7 @@ #define ZSTD_STATIC_LINKING_ONLY #include "zstd.h" +#include "zstd_errors.h" #include "fuzz_data_producer.h" #include From 4b24ebdcf33cc5c2819272278e2d742b9d0f72fe Mon Sep 17 00:00:00 2001 From: Yonatan Komornik <11005061+yoniko@users.noreply.github.com> Date: Mon, 31 Jan 2022 16:49:49 -0800 Subject: [PATCH 076/472] Travis CI: fix by installing pip compatible with python 3.6 (#3041) Pip install script no longer supports python3.6 by default, switched to a script that does. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6a1295b4c..c49f3ee3d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -102,7 +102,7 @@ matrix: travis_retry curl -o ~/ninja.zip -L 'https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-linux.zip' && unzip ~/ninja.zip -d ~/.local/bin - | - travis_retry curl -o ~/get-pip.py -L 'https://bootstrap.pypa.io/get-pip.py' && + travis_retry curl -o ~/get-pip.py -L 'https://bootstrap.pypa.io/pip/3.6/get-pip.py' && python3 ~/get-pip.py --user && pip3 install --user meson script: From cad9f8d5f9c451b1cc8ce00a16c125e3d2ffc418 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 31 Jan 2022 09:34:04 -0800 Subject: [PATCH 077/472] fix 44239 credit to oss-fuzz This issue could happen when using the new Sequence Compression API in Explicit Delimiter Mode with a too small dstCapacity. In which case, there was one place where the buffer size wasn't checked. --- lib/compress/zstd_compress.c | 21 ++++++++++++--------- lib/compress/zstd_compress_internal.h | 7 +++++-- lib/compress/zstd_compress_literals.c | 6 ++++-- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index b9358fa0c..eda38480b 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2595,7 +2595,7 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, entropyWorkspace = count + (MaxSeq + 1); entropyWkspSize -= (MaxSeq + 1) * sizeof(*count); - DEBUGLOG(5, "ZSTD_entropyCompressSeqStore_internal (nbSeq=%zu)", nbSeq); + DEBUGLOG(5, "ZSTD_entropyCompressSeqStore_internal (nbSeq=%zu, dstCapacity=%zu)", nbSeq, dstCapacity); ZSTD_STATIC_ASSERT(HUF_WORKSPACE_SIZE >= (1<= HUF_WORKSPACE_SIZE); @@ -2639,7 +2639,7 @@ ZSTD_entropyCompressSeqStore_internal(seqStore_t* seqStorePtr, ZSTD_memcpy(&nextEntropy->fse, &prevEntropy->fse, sizeof(prevEntropy->fse)); return (size_t)(op - ostart); } - { BYTE* seqHead = op++; + { BYTE* const seqHead = op++; /* build stats for sequences */ const ZSTD_symbolEncodingTypeStats_t stats = ZSTD_buildSequencesStatistics(seqStorePtr, nbSeq, @@ -2702,15 +2702,17 @@ ZSTD_entropyCompressSeqStore(seqStore_t* seqStorePtr, /* When srcSize <= dstCapacity, there is enough space to write a raw uncompressed block. * Since we ran out of space, block must be not compressible, so fall back to raw uncompressed block. */ - if ((cSize == ERROR(dstSize_tooSmall)) & (srcSize <= dstCapacity)) + if ((cSize == ERROR(dstSize_tooSmall)) & (srcSize <= dstCapacity)) { + DEBUGLOG(4, "not enough dstCapacity (%zu) for ZSTD_entropyCompressSeqStore_internal()=> do not compress block", dstCapacity); return 0; /* block not compressed */ + } FORWARD_IF_ERROR(cSize, "ZSTD_entropyCompressSeqStore_internal failed"); /* Check compressibility */ { size_t const maxCSize = srcSize - ZSTD_minGain(srcSize, cctxParams->cParams.strategy); if (cSize >= maxCSize) return 0; /* block not compressed */ } - DEBUGLOG(4, "ZSTD_entropyCompressSeqStore() cSize: %zu", cSize); + DEBUGLOG(5, "ZSTD_entropyCompressSeqStore() cSize: %zu", cSize); return cSize; } @@ -6159,6 +6161,7 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, continue; } + RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize, dstSize_tooSmall, "not enough dstCapacity to write a new compressed block"); compressedSeqsSize = ZSTD_entropyCompressSeqStore(&cctx->seqStore, &cctx->blockState.prevCBlock->entropy, &cctx->blockState.nextCBlock->entropy, &cctx->appliedParams, @@ -6182,11 +6185,11 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, if (compressedSeqsSize == 0) { /* ZSTD_noCompressBlock writes the block header as well */ cBlockSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock); - FORWARD_IF_ERROR(cBlockSize, "Nocompress block failed"); + FORWARD_IF_ERROR(cBlockSize, "ZSTD_noCompressBlock failed"); DEBUGLOG(5, "Writing out nocompress block, size: %zu", cBlockSize); } else if (compressedSeqsSize == 1) { cBlockSize = ZSTD_rleCompressBlock(op, dstCapacity, *ip, blockSize, lastBlock); - FORWARD_IF_ERROR(cBlockSize, "RLE compress block failed"); + FORWARD_IF_ERROR(cBlockSize, "ZSTD_rleCompressBlock failed"); DEBUGLOG(5, "Writing out RLE block, size: %zu", cBlockSize); } else { U32 cBlockHeader; @@ -6203,7 +6206,6 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, } cSize += cBlockSize; - DEBUGLOG(5, "cSize running total: %zu", cSize); if (lastBlock) { break; @@ -6214,6 +6216,7 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, dstCapacity -= cBlockSize; cctx->isFirstBlock = 0; } + DEBUGLOG(5, "cSize running total: %zu (remaining dstCapacity=%zu)", cSize, dstCapacity); } DEBUGLOG(4, "cSize final total: %zu", cSize); @@ -6231,7 +6234,7 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* cctx, size_t frameHeaderSize = 0; /* Transparent initialization stage, same as compressStream2() */ - DEBUGLOG(3, "ZSTD_compressSequences()"); + DEBUGLOG(4, "ZSTD_compressSequences (dstCapacity=%zu)", dstCapacity); assert(cctx != NULL); FORWARD_IF_ERROR(ZSTD_CCtx_init_compressStream2(cctx, ZSTD_e_end, srcSize), "CCtx initialization failed"); /* Begin writing output, starting with frame header */ @@ -6259,7 +6262,7 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* cctx, cSize += 4; } - DEBUGLOG(3, "Final compressed size: %zu", cSize); + DEBUGLOG(4, "Final compressed size: %zu", cSize); return cSize; } diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index ddd5d0296..f027f4612 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -513,9 +513,11 @@ MEM_STATIC int ZSTD_cParam_withinBounds(ZSTD_cParameter cParam, int value) /* ZSTD_noCompressBlock() : * Writes uncompressed block to dst buffer from given src. * Returns the size of the block */ -MEM_STATIC size_t ZSTD_noCompressBlock (void* dst, size_t dstCapacity, const void* src, size_t srcSize, U32 lastBlock) +MEM_STATIC size_t +ZSTD_noCompressBlock(void* dst, size_t dstCapacity, const void* src, size_t srcSize, U32 lastBlock) { U32 const cBlockHeader24 = lastBlock + (((U32)bt_raw)<<1) + (U32)(srcSize << 3); + DEBUGLOG(5, "ZSTD_noCompressBlock (srcSize=%zu, dstCapacity=%zu)", srcSize, dstCapacity); RETURN_ERROR_IF(srcSize + ZSTD_blockHeaderSize > dstCapacity, dstSize_tooSmall, "dst buf too small for uncompressed block"); MEM_writeLE24(dst, cBlockHeader24); @@ -523,7 +525,8 @@ MEM_STATIC size_t ZSTD_noCompressBlock (void* dst, size_t dstCapacity, const voi return ZSTD_blockHeaderSize + srcSize; } -MEM_STATIC size_t ZSTD_rleCompressBlock (void* dst, size_t dstCapacity, BYTE src, size_t srcSize, U32 lastBlock) +MEM_STATIC size_t +ZSTD_rleCompressBlock(void* dst, size_t dstCapacity, BYTE src, size_t srcSize, U32 lastBlock) { BYTE* const op = (BYTE*)dst; U32 const cBlockHeader = lastBlock + (((U32)bt_rle)<<1) + (U32)(srcSize << 3); diff --git a/lib/compress/zstd_compress_literals.c b/lib/compress/zstd_compress_literals.c index 83f911648..15bde09e6 100644 --- a/lib/compress/zstd_compress_literals.c +++ b/lib/compress/zstd_compress_literals.c @@ -41,6 +41,8 @@ size_t ZSTD_noCompressLiterals (void* dst, size_t dstCapacity, const void* src, BYTE* const ostart = (BYTE*)dst; U32 const flSize = 1 + (srcSize>31) + (srcSize>4095); + DEBUGLOG(5, "ZSTD_noCompressLiterals: srcSize=%zu, dstCapacity=%zu", srcSize, dstCapacity); + RETURN_ERROR_IF(srcSize + flSize > dstCapacity, dstSize_tooSmall, ""); switch(flSize) @@ -106,8 +108,8 @@ size_t ZSTD_compressLiterals (ZSTD_hufCTables_t const* prevHuf, symbolEncodingType_e hType = set_compressed; size_t cLitSize; - DEBUGLOG(5,"ZSTD_compressLiterals (disableLiteralCompression=%i srcSize=%u)", - disableLiteralCompression, (U32)srcSize); + DEBUGLOG(5,"ZSTD_compressLiterals (disableLiteralCompression=%i, srcSize=%u, dstCapacity=%zu)", + disableLiteralCompression, (U32)srcSize, dstCapacity); DEBUGLOG(6, "Completed literals listing (%zu bytes)", showHexa(src, srcSize)); From 470eb8330a9821c334df7efe66945a63d1faf017 Mon Sep 17 00:00:00 2001 From: Jonathan McDowell Date: Tue, 1 Feb 2022 03:20:30 -0800 Subject: [PATCH 078/472] Fix required decompression memory usage reported by -vv + --long The use of --long alters the window size internally in the underlying library (lib/compress/zstd_compress.c:ZSTD_getCParamsFromCCtxParams), which changes the memory required for decompression. This means that the reported requirement from the zstd binary when -vv is specified is incorrect. A full fix for this would be to add an API call to be able to retrieve the required decompression memory from the library, but as a lighterweight fix we can just take account of the fact we've enabled long mode and update our verbose output appropriately. Fixes #2968 --- programs/fileio.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index 502f69c15..e37921ada 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -1301,8 +1301,13 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, UTIL_HumanReadableSize_t windowSize; CHECK(ZSTD_CCtx_getParameter(ress.cctx, ZSTD_c_windowLog, &windowLog)); if (windowLog == 0) { - const ZSTD_compressionParameters cParams = ZSTD_getCParams(compressionLevel, fileSize, 0); - windowLog = cParams.windowLog; + if (prefs->ldmFlag) { + /* If long mode is set without a window size libzstd will set this size internally */ + windowLog = ZSTD_WINDOWLOG_LIMIT_DEFAULT; + } else { + const ZSTD_compressionParameters cParams = ZSTD_getCParams(compressionLevel, fileSize, 0); + windowLog = cParams.windowLog; + } } windowSize = UTIL_makeHumanReadableSize(MAX(1ULL, MIN(1ULL << windowLog, pledgedSrcSize))); DISPLAYLEVEL(4, "Decompression will require %.*f%s of memory\n", windowSize.precision, windowSize.value, windowSize.suffix); From 4c4d403ecba80e372e413b219e44df2ff7339a52 Mon Sep 17 00:00:00 2001 From: Dimitris Apostolou Date: Wed, 2 Feb 2022 19:32:31 +0200 Subject: [PATCH 079/472] Fix typos --- programs/fileio_asyncio.c | 2 +- programs/fileio_asyncio.h | 2 +- tests/cli-tests/README.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/programs/fileio_asyncio.c b/programs/fileio_asyncio.c index 332292bbc..92c9a5b1d 100644 --- a/programs/fileio_asyncio.c +++ b/programs/fileio_asyncio.c @@ -415,7 +415,7 @@ static IOJob_t* AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked(ReadPoolCt } /* AIO_ReadPool_numReadsInFlight: - * Returns the number of IO read jobs currrently in flight. */ + * Returns the number of IO read jobs currently in flight. */ static size_t AIO_ReadPool_numReadsInFlight(ReadPoolCtx_t* ctx) { const size_t jobsHeld = (ctx->currentJobHeld==NULL ? 0 : 1); return ctx->base.totalIoJobs - (ctx->base.availableJobsCount + ctx->completedJobsCount + jobsHeld); diff --git a/programs/fileio_asyncio.h b/programs/fileio_asyncio.h index bf07f8594..30db44b6e 100644 --- a/programs/fileio_asyncio.h +++ b/programs/fileio_asyncio.h @@ -151,7 +151,7 @@ void AIO_ReadPool_free(ReadPoolCtx_t* ctx); void AIO_ReadPool_consumeBytes(ReadPoolCtx_t *ctx, size_t n); /* AIO_ReadPool_fillBuffer: - * Makes sure buffer has at least n bytes loaded (as long as n is not bigger than the initalized bufferSize). + * Makes sure buffer has at least n bytes loaded (as long as n is not bigger than the initialized bufferSize). * Returns if srcBuffer has at least n bytes loaded or if we've reached the end of the file. * Return value is the number of bytes added to the buffer. * Note that srcBuffer might have up to 2 times bufferSize bytes. */ diff --git a/tests/cli-tests/README.md b/tests/cli-tests/README.md index 3098f466f..cdf9b8e71 100644 --- a/tests/cli-tests/README.md +++ b/tests/cli-tests/README.md @@ -67,9 +67,9 @@ They are generally used by the helper scripts in `bin/` to coordinate everything ### Basic test case -When executing your `$TEST` executable, by default the exit code is expected to be `0`. However, you can provide an alterate expected exit code in a `$TEST.exit` file. +When executing your `$TEST` executable, by default the exit code is expected to be `0`. However, you can provide an alternate expected exit code in a `$TEST.exit` file. -When executing your `$TEST` exectuable, by default the expected stderr and stdout are empty. However, you can override the default by providing one of three files: +When executing your `$TEST` executable, by default the expected stderr and stdout are empty. However, you can override the default by providing one of three files: * `$TEST.{stdout,stderr}.exact` * `$TEST.{stdout,stderr}.glob` From b9566fc558830de2a3fd486961b674774c17b74e Mon Sep 17 00:00:00 2001 From: binhdvo Date: Wed, 2 Feb 2022 15:12:48 -0500 Subject: [PATCH 080/472] Add rails for huffman table log calculation (#3047) --- lib/compress/huf_compress.c | 5 ++++- lib/compress/zstd_compress.c | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c index d1b98afdb..a8677733b 100644 --- a/lib/compress/huf_compress.c +++ b/lib/compress/huf_compress.c @@ -1224,7 +1224,10 @@ static size_t HUF_compressCTable_internal( unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue) { - return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 1); + unsigned tableLog = FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 1); + assert(tableLog <= HUF_TABLELOG_MAX); + + return tableLog; } typedef struct { diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index eda38480b..37b6e2ff4 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -3112,6 +3112,7 @@ static size_t ZSTD_buildBlockEntropyStats_literals(void* const src, size_t srcSi /* Build Huffman Tree */ ZSTD_memset(nextHuf->CTable, 0, sizeof(nextHuf->CTable)); huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue); + assert(huffLog <= LitHufLog); { size_t const maxBits = HUF_buildCTable_wksp((HUF_CElt*)nextHuf->CTable, countWksp, maxSymbolValue, huffLog, nodeWksp, nodeWkspSize); From 4bba97b4cb8705447123a9447854b78662c82ba0 Mon Sep 17 00:00:00 2001 From: Yonatan Komornik <11005061+yoniko@users.noreply.github.com> Date: Thu, 3 Feb 2022 18:42:20 -0800 Subject: [PATCH 081/472] Macos playtest envvars fix (#3035) * playtests.sh: fix for a bug in macos' /bin/sh that persists temporary env vars when introduced before function calls * cli-tests/run.py: Do not use existing ZSTD* envvars --- tests/cli-tests/run.py | 4 +++- tests/playTests.sh | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/cli-tests/run.py b/tests/cli-tests/run.py index 6791918a5..39b53a09b 100755 --- a/tests/cli-tests/run.py +++ b/tests/cli-tests/run.py @@ -278,10 +278,12 @@ class TestCase: Returns the environment to be used for the test subprocess. """ - env = copy.copy(os.environ) + # We want to omit ZSTD cli flags so tests will be consistent across environments + env = {k: v for k, v in os.environ.items() if not k.startswith("ZSTD")} for k, v in self._opts.env.items(): self._vlog(f"${k}='{v}'") env[k] = v + return env def _launch_test(self) -> None: """Launch the test subprocess, but do not join it.""" diff --git a/tests/playTests.sh b/tests/playTests.sh index f97e96e37..9b01d4d5e 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -2,6 +2,10 @@ set -e +unset ZSTD_CLEVEL +unset ZSTD_NBTHREADS + + die() { println "$@" 1>&2 exit 1 @@ -210,6 +214,7 @@ zstd -c --fast=0 tmp > $INTOVOID && die "--fast must not accept value 0" println "test : too large numeric argument" zstd --fast=9999999999 -f tmp && die "should have refused numeric value" println "test : set compression level with environment variable ZSTD_CLEVEL" + ZSTD_CLEVEL=12 zstd -f tmp # positive compression level ZSTD_CLEVEL=-12 zstd -f tmp # negative compression level ZSTD_CLEVEL=+12 zstd -f tmp # valid: verbose '+' sign @@ -221,6 +226,11 @@ ZSTD_CLEVEL=3a7 zstd -f tmp # malformed env var, warn and revert to default sett ZSTD_CLEVEL=50000000000 zstd -f tmp # numeric value too large, warn and revert to default setting println "test : override ZSTD_CLEVEL with command line option" ZSTD_CLEVEL=12 zstd --fast=3 -f tmp # overridden by command line option + +# temporary envvar chnages in the above tests would actually persist in macos /bin/sh +unset ZSTD_CLEVEL + + println "test : compress to stdout" zstd tmp -c > tmpCompressed zstd tmp --stdout > tmpCompressed # long command format @@ -1465,6 +1475,8 @@ then ZSTD_NBTHREADS=50000000000 zstd -f mt_tmp # numeric value too large, warn and revert to default setting= ZSTD_NBTHREADS=2 zstd -f mt_tmp # correct usage ZSTD_NBTHREADS=1 zstd -f mt_tmp # correct usage: single thread + # temporary envvar chnages in the above tests would actually persist in macos /bin/sh + unset ZSTD_NBTHREADS rm -f mt_tmp* println "\n===> ovLog tests " From 317bd108fe7b75ac426ad7ff95f9ca48536f0b03 Mon Sep 17 00:00:00 2001 From: Alexander Shadchin Date: Fri, 4 Feb 2022 14:24:58 +0300 Subject: [PATCH 082/472] Select legacy level for cmake --- build/cmake/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/cmake/CMakeLists.txt b/build/cmake/CMakeLists.txt index 93a167caf..fdf7c8637 100644 --- a/build/cmake/CMakeLists.txt +++ b/build/cmake/CMakeLists.txt @@ -86,7 +86,8 @@ option(ZSTD_LEGACY_SUPPORT "LEGACY SUPPORT" OFF) if (ZSTD_LEGACY_SUPPORT) message(STATUS "ZSTD_LEGACY_SUPPORT defined!") - add_definitions(-DZSTD_LEGACY_SUPPORT=5) + set(ZSTD_LEGACY_LEVEL 5 CACHE STRING "") + add_definitions(-DZSTD_LEGACY_SUPPORT=${ZSTD_LEGACY_LEVEL}) else () message(STATUS "ZSTD_LEGACY_SUPPORT not defined!") add_definitions(-DZSTD_LEGACY_SUPPORT=0) From fede1d3abe08f52ab981eefa5c87208334933f36 Mon Sep 17 00:00:00 2001 From: Oscar Shi Date: Mon, 7 Feb 2022 14:41:07 -0800 Subject: [PATCH 083/472] [trace] Add aarch64 to supported architectures for zstd_trace Arm Toolchain should support weak symbols --- lib/common/zstd_trace.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/common/zstd_trace.h b/lib/common/zstd_trace.h index f9121f7d8..6215f1e70 100644 --- a/lib/common/zstd_trace.h +++ b/lib/common/zstd_trace.h @@ -21,13 +21,13 @@ extern "C" { * For now, enable conservatively: * - Only GNUC * - Only ELF - * - Only x86-64 and i386 + * - Only x86-64, i386 and aarch64 * Also, explicitly disable on platforms known not to work so they aren't * forgotten in the future. */ #if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && \ defined(__GNUC__) && defined(__ELF__) && \ - (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) && \ + (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) || defined(__aarch64__)) && \ !defined(__APPLE__) && !defined(_WIN32) && !defined(__MINGW32__) && \ !defined(__CYGWIN__) && !defined(_AIX) # define ZSTD_HAVE_WEAK_SYMBOLS 1 From 169f8c11fff94c7cb2280efb1b5ae3c8fb3a7c5c Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Mon, 7 Feb 2022 15:20:42 -0800 Subject: [PATCH 084/472] [cli-tests] Fix zstd symlinks The zstd symlinks, notably `zstdcat`, weren't working as expected because only the `tests/cli-tests/bin/zstd` wrapper was symlinked. We still invoked `zstd` with the name `zstd`. The fix is to create a directory of zstd symlinks in `tests/cli-tests/bin/symlinks` for each name that zstd recognizes. And when `tets/cli-tests/bin/zstd` is invoked, it selects the correct symlink to call. See the test `zstd-cli/zstdcat.sh` for an example of how it would work. --- tests/cli-tests/.gitignore | 4 +- tests/cli-tests/bin/zstd | 6 ++- tests/cli-tests/run.py | 37 +++++++++++++++++-- tests/cli-tests/zstd-symlinks/setup | 6 +++ tests/cli-tests/zstd-symlinks/zstdcat.sh | 12 ++++++ .../zstd-symlinks/zstdcat.sh.stdout.exact | 8 ++++ 6 files changed, 67 insertions(+), 6 deletions(-) create mode 100755 tests/cli-tests/zstd-symlinks/setup create mode 100755 tests/cli-tests/zstd-symlinks/zstdcat.sh create mode 100644 tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact diff --git a/tests/cli-tests/.gitignore b/tests/cli-tests/.gitignore index 4bb425b61..0ad01b24e 100644 --- a/tests/cli-tests/.gitignore +++ b/tests/cli-tests/.gitignore @@ -1,4 +1,6 @@ -scratch/ !bin/ !datagen !zstdcat + +scratch/ +bin/symlinks diff --git a/tests/cli-tests/bin/zstd b/tests/cli-tests/bin/zstd index 198fc6d2d..7a40aec90 100755 --- a/tests/cli-tests/bin/zstd +++ b/tests/cli-tests/bin/zstd @@ -1,7 +1,9 @@ #!/bin/sh +zstdname=$(basename $0) + if [ -z "$EXEC_PREFIX" ]; then - "$ZSTD_BIN" $@ + "$ZSTD_SYMLINK_DIR/$zstdname" $@ else - $EXEC_PREFIX "$ZSTD_BIN" $@ + $EXEC_PREFIX "$ZSTD_SYMLINK_DIR/$zstdname" $@ fi diff --git a/tests/cli-tests/run.py b/tests/cli-tests/run.py index 39b53a09b..f2614b059 100755 --- a/tests/cli-tests/run.py +++ b/tests/cli-tests/run.py @@ -21,6 +21,24 @@ import tempfile import typing +ZSTD_SYMLINKS = [ + "zstd", + "zstdmt", + "unzstd", + "zstdcat", + "zcat", + "gzip", + "gunzip", + "gzcat", + "lzma", + "unlzma", + "xz", + "unxz", + "lz4", + "unlz4", +] + + EXCLUDED_DIRS = { "bin", "common", @@ -592,6 +610,16 @@ def run_tests(test_suites: TestSuites, options: Options) -> bool: return False +def setup_zstd_symlink_dir(zstd_symlink_dir: str, zstd: str) -> None: + assert os.path.join("bin", "symlinks") in zstd_symlink_dir + if not os.path.exists(zstd_symlink_dir): + os.makedirs(zstd_symlink_dir) + for symlink in ZSTD_SYMLINKS: + path = os.path.join(zstd_symlink_dir, symlink) + if os.path.exists(path): + os.remove(path) + os.symlink(zstd, path) + if __name__ == "__main__": CLI_TEST_DIR = os.path.dirname(sys.argv[0]) REPO_DIR = os.path.join(CLI_TEST_DIR, "..", "..") @@ -655,17 +683,20 @@ if __name__ == "__main__": args.timeout = None args.test_dir = os.path.normpath(os.path.abspath(args.test_dir)) - bin_dir = os.path.join(args.test_dir, "bin") + bin_dir = os.path.abspath(os.path.join(args.test_dir, "bin")) + zstd_symlink_dir = os.path.join(bin_dir, "symlinks") scratch_dir = os.path.join(args.test_dir, "scratch") + setup_zstd_symlink_dir(zstd_symlink_dir, os.path.abspath(args.zstd)) + env = {} if args.exec_prefix is not None: env["EXEC_PREFIX"] = args.exec_prefix - env["ZSTD_BIN"] = os.path.abspath(args.zstd) + env["ZSTD_SYMLINK_DIR"] = zstd_symlink_dir env["DATAGEN_BIN"] = os.path.abspath(args.datagen) env["ZSTDGREP_BIN"] = os.path.abspath(args.zstdgrep) env["COMMON"] = os.path.abspath(os.path.join(args.test_dir, "common")) - env["PATH"] = os.path.abspath(bin_dir) + ":" + os.getenv("PATH", "") + env["PATH"] = bin_dir + ":" + os.getenv("PATH", "") opts = Options( env=env, diff --git a/tests/cli-tests/zstd-symlinks/setup b/tests/cli-tests/zstd-symlinks/setup new file mode 100755 index 000000000..cf391ed21 --- /dev/null +++ b/tests/cli-tests/zstd-symlinks/setup @@ -0,0 +1,6 @@ +#!/bin/sh +set -e + +println "hello" > hello +println "world" > world +zstd hello world diff --git a/tests/cli-tests/zstd-symlinks/zstdcat.sh b/tests/cli-tests/zstd-symlinks/zstdcat.sh new file mode 100755 index 000000000..74ec063d1 --- /dev/null +++ b/tests/cli-tests/zstd-symlinks/zstdcat.sh @@ -0,0 +1,12 @@ +#!/bin/sh +set -e + +# Test zstdcat symlink in bin/ +zstdcat hello.zst +zstdcat hello.zst world +zstdcat hello world.zst +zstdcat hello.zst world.zst + +# Test local zstdcat symlink +ln -s $(which zstd) ./zstdcat +./zstdcat hello.zst diff --git a/tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact b/tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact new file mode 100644 index 000000000..3205b059b --- /dev/null +++ b/tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact @@ -0,0 +1,8 @@ +hello +hello +world +hello +world +hello +world +hello From f17652931c4f8cebeecebbc4f4a45c47eb81ffca Mon Sep 17 00:00:00 2001 From: yhoogstrate Date: Tue, 8 Feb 2022 14:06:00 +0100 Subject: [PATCH 085/472] seekable_format no header when compressing empty string to stream --- .../seekable_format/tests/seekable_tests.c | 30 +++++++++++++++++++ contrib/seekable_format/zstdseek_compress.c | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/contrib/seekable_format/tests/seekable_tests.c b/contrib/seekable_format/tests/seekable_tests.c index a482638b9..cf98e734f 100644 --- a/contrib/seekable_format/tests/seekable_tests.c +++ b/contrib/seekable_format/tests/seekable_tests.c @@ -186,6 +186,36 @@ int main(int argc, const char** argv) } printf("Success!\n"); + + printf("Test %u - check ZSTD magic in compressing empty string: ", testNb++); + { // compressing empty string should return a zstd header + char *data_in = (char *) malloc(255 * sizeof(char)); + assert(data_in != NULL); + data_in = "\0"; + + char *data_out = (char *) malloc(255 * 255 * sizeof(char)); + assert(data_out != NULL); + + ZSTD_seekable_CStream *s = ZSTD_seekable_createCStream(); + ZSTD_seekable_initCStream(s, 1, 1, 1024 * 1024); + + ZSTD_inBuffer input = { data_in, 0, 0 }; + ZSTD_outBuffer output = { data_out, 255*255, 0 }; + + ZSTD_seekable_compressStream(s, &output, &input); + ZSTD_seekable_endStream(s, &output); + + if((((char*)output.dst)[0] != '\x28') | (((char*)output.dst)[1] != '\xb5') | (((char*)output.dst)[2] != '\x2f') | (((char*)output.dst)[3] != '\xfd')) { + printf("%#02x %#02x %#02x %#02x\n", ((char*)output.dst)[0], ((char*)output.dst)[1] , ((char*)output.dst)[2] , ((char*)output.dst)[3] ); + + ZSTD_seekable_freeCStream(s); + goto _test_error; + } + + ZSTD_seekable_freeCStream(s); + } + printf("Success!\n"); + /* TODO: Add more tests */ printf("Finished tests\n"); return 0; diff --git a/contrib/seekable_format/zstdseek_compress.c b/contrib/seekable_format/zstdseek_compress.c index 242bd2ac3..7ec9bb577 100644 --- a/contrib/seekable_format/zstdseek_compress.c +++ b/contrib/seekable_format/zstdseek_compress.c @@ -350,7 +350,7 @@ size_t ZSTD_seekable_writeSeekTable(ZSTD_frameLog* fl, ZSTD_outBuffer* output) size_t ZSTD_seekable_endStream(ZSTD_seekable_CStream* zcs, ZSTD_outBuffer* output) { - if (!zcs->writingSeekTable && zcs->frameDSize) { + if (!zcs->writingSeekTable) { const size_t endFrame = ZSTD_seekable_endFrame(zcs, output); if (ZSTD_isError(endFrame)) return endFrame; /* return an accurate size hint */ From 936ae8a3a0bdb8b4cf54f29b2713ca3573e1c609 Mon Sep 17 00:00:00 2001 From: binhdvo Date: Wed, 9 Feb 2022 11:21:33 -0500 Subject: [PATCH 086/472] Move zstdgrep and zstdless tests to cli-tests (#3057) * Move zstdgrep and zstdless tests to cli-tests Co-authored-by: Binh Vo --- tests/cli-tests/bin/zstdless | 2 ++ tests/cli-tests/cltools/setup | 6 +++++ tests/cli-tests/cltools/zstdgrep.sh | 8 ++++++ tests/cli-tests/cltools/zstdgrep.sh.exit | 1 + .../cltools/zstdgrep.sh.stderr.exact | 1 + .../cli-tests/cltools/zstdgrep.sh.stdout.glob | 4 +++ tests/cli-tests/cltools/zstdless.sh | 10 +++++++ .../cltools/zstdless.sh.stderr.exact | 2 ++ .../cli-tests/cltools/zstdless.sh.stdout.glob | 5 ++++ tests/cli-tests/run.py | 7 +++++ tests/playTests.sh | 27 ------------------- 11 files changed, 46 insertions(+), 27 deletions(-) create mode 100755 tests/cli-tests/bin/zstdless create mode 100755 tests/cli-tests/cltools/setup create mode 100755 tests/cli-tests/cltools/zstdgrep.sh create mode 100644 tests/cli-tests/cltools/zstdgrep.sh.exit create mode 100644 tests/cli-tests/cltools/zstdgrep.sh.stderr.exact create mode 100644 tests/cli-tests/cltools/zstdgrep.sh.stdout.glob create mode 100755 tests/cli-tests/cltools/zstdless.sh create mode 100644 tests/cli-tests/cltools/zstdless.sh.stderr.exact create mode 100644 tests/cli-tests/cltools/zstdless.sh.stdout.glob diff --git a/tests/cli-tests/bin/zstdless b/tests/cli-tests/bin/zstdless new file mode 100755 index 000000000..d1d6f82d2 --- /dev/null +++ b/tests/cli-tests/bin/zstdless @@ -0,0 +1,2 @@ +#!/bin/sh +"$ZSTDLESS_BIN" $@ diff --git a/tests/cli-tests/cltools/setup b/tests/cli-tests/cltools/setup new file mode 100755 index 000000000..3009bd5be --- /dev/null +++ b/tests/cli-tests/cltools/setup @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +echo "1234" > file +zstd file diff --git a/tests/cli-tests/cltools/zstdgrep.sh b/tests/cli-tests/cltools/zstdgrep.sh new file mode 100755 index 000000000..6cd68b7ab --- /dev/null +++ b/tests/cli-tests/cltools/zstdgrep.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + +println "+ good path" +zstdgrep "1234" file file.zst +println "+ bad path" +zstdgrep "1234" bad.zst diff --git a/tests/cli-tests/cltools/zstdgrep.sh.exit b/tests/cli-tests/cltools/zstdgrep.sh.exit new file mode 100644 index 000000000..56a6051ca --- /dev/null +++ b/tests/cli-tests/cltools/zstdgrep.sh.exit @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/tests/cli-tests/cltools/zstdgrep.sh.stderr.exact b/tests/cli-tests/cltools/zstdgrep.sh.stderr.exact new file mode 100644 index 000000000..f147f28d7 --- /dev/null +++ b/tests/cli-tests/cltools/zstdgrep.sh.stderr.exact @@ -0,0 +1 @@ +zstd: can't stat bad.zst : No such file or directory -- ignored diff --git a/tests/cli-tests/cltools/zstdgrep.sh.stdout.glob b/tests/cli-tests/cltools/zstdgrep.sh.stdout.glob new file mode 100644 index 000000000..96d4fa2cb --- /dev/null +++ b/tests/cli-tests/cltools/zstdgrep.sh.stdout.glob @@ -0,0 +1,4 @@ ++ good path +file:1234 +file.zst:1234 ++ bad path diff --git a/tests/cli-tests/cltools/zstdless.sh b/tests/cli-tests/cltools/zstdless.sh new file mode 100755 index 000000000..61f768862 --- /dev/null +++ b/tests/cli-tests/cltools/zstdless.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +set -e + +println "+ good path" +zstdless file.zst +println "+ pass parameters" +zstdless -N file.zst # This parameter does not produce line #s when piped, but still serves to test that the flag went to less and not zstd +println "+ bad path" +zstdless bad.zst diff --git a/tests/cli-tests/cltools/zstdless.sh.stderr.exact b/tests/cli-tests/cltools/zstdless.sh.stderr.exact new file mode 100644 index 000000000..5a726f1d1 --- /dev/null +++ b/tests/cli-tests/cltools/zstdless.sh.stderr.exact @@ -0,0 +1,2 @@ +zstd: can't stat bad.zst : No such file or directory -- ignored +bad.zst: No such file or directory diff --git a/tests/cli-tests/cltools/zstdless.sh.stdout.glob b/tests/cli-tests/cltools/zstdless.sh.stdout.glob new file mode 100644 index 000000000..2784dddf1 --- /dev/null +++ b/tests/cli-tests/cltools/zstdless.sh.stdout.glob @@ -0,0 +1,5 @@ ++ good path +1234 ++ pass parameters +1234 ++ bad path diff --git a/tests/cli-tests/run.py b/tests/cli-tests/run.py index f2614b059..9bba2ecd1 100755 --- a/tests/cli-tests/run.py +++ b/tests/cli-tests/run.py @@ -627,6 +627,7 @@ if __name__ == "__main__": TESTS_DIR = os.path.join(REPO_DIR, "tests") ZSTD_PATH = os.path.join(PROGRAMS_DIR, "zstd") ZSTDGREP_PATH = os.path.join(PROGRAMS_DIR, "zstdgrep") + ZSTDLESS_PATH = os.path.join(PROGRAMS_DIR, "zstdless") DATAGEN_PATH = os.path.join(TESTS_DIR, "datagen") parser = argparse.ArgumentParser( @@ -658,6 +659,11 @@ if __name__ == "__main__": default=ZSTDGREP_PATH, help="Sets the ZSTDGREP_BIN environment variable. Path of the zstdgrep CLI." ) + parser.add_argument( + "--zstdless", + default=ZSTDLESS_PATH, + help="Sets the ZSTDLESS_BIN environment variable. Path of the zstdless CLI." + ) parser.add_argument( "--datagen", default=DATAGEN_PATH, @@ -695,6 +701,7 @@ if __name__ == "__main__": env["ZSTD_SYMLINK_DIR"] = zstd_symlink_dir env["DATAGEN_BIN"] = os.path.abspath(args.datagen) env["ZSTDGREP_BIN"] = os.path.abspath(args.zstdgrep) + env["ZSTDLESS_BIN"] = os.path.abspath(args.zstdless) env["COMMON"] = os.path.abspath(os.path.join(args.test_dir, "common")) env["PATH"] = bin_dir + ":" + os.getenv("PATH", "") diff --git a/tests/playTests.sh b/tests/playTests.sh index 9b01d4d5e..71e8dc058 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -92,8 +92,6 @@ SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) PRGDIR="$SCRIPT_DIR/../programs" TESTDIR="$SCRIPT_DIR/../tests" UNAME=$(uname) -ZSTDGREP="$PRGDIR/zstdgrep" -ZSTDLESS="$PRGDIR/zstdless" detectedTerminal=false if [ -t 0 ] && [ -t 1 ] @@ -326,31 +324,6 @@ if [ "$isWindows" = false ]; then fi fi -println "\n===> zstdgrep tests" -ln -sf "$ZSTD_BIN" zstdcat -rm -f tmp_grep -echo "1234" > tmp_grep -zstd -f tmp_grep -lines=$(ZCAT=./zstdcat "$ZSTDGREP" 2>&1 "1234" tmp_grep tmp_grep.zst | wc -l) -test 2 -eq $lines -ZCAT=./zstdcat "$ZSTDGREP" 2>&1 "1234" tmp_grep_bad.zst && die "Should have failed" -ZCAT=./zstdcat "$ZSTDGREP" 2>&1 "1234" tmp_grep_bad.zst | grep "No such file or directory" || true -rm -f tmp_grep* - -println "\n===> zstdless tests" -if [ -n "$(which less)" ]; then - ln -sf "$ZSTD_BIN" zstd - rm -f tmp_less* - echo "1234" > tmp_less - zstd -f tmp_less - lines=$(ZSTD=./zstd "$ZSTDLESS" 2>&1 tmp_less.zst | wc -l) - test 1 -eq $lines - ZSTD=./zstd "$ZSTDLESS" -f tmp_less.zst > tmp_less_regenerated - $DIFF tmp_less tmp_less_regenerated - ZSTD=./zstd "$ZSTDLESS" 2>&1 tmp_less_bad.zst | grep "No such file or directory" || die - rm -f tmp_less* -fi - println "\n===> --exclude-compressed flag" rm -rf precompressedFilterTestDir mkdir -p precompressedFilterTestDir From 9caabc01c412ab3bd3f6a34c34efd59c0fc659ac Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 9 Feb 2022 14:44:46 -0500 Subject: [PATCH 087/472] Replace "windows-latest" with "windows-2019" in CI workflows --- .github/workflows/dev-long-tests.yml | 2 +- .github/workflows/dev-short-tests.yml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dev-long-tests.yml b/.github/workflows/dev-long-tests.yml index 7a94fb666..60d1d45b9 100644 --- a/.github/workflows/dev-long-tests.yml +++ b/.github/workflows/dev-long-tests.yml @@ -158,7 +158,7 @@ jobs: make -C tests test-fuzzer-stackmode mingw-long-test: - runs-on: windows-latest + runs-on: windows-2019 strategy: fail-fast: false matrix: diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index dfff4cbed..a54796916 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -175,7 +175,7 @@ jobs: CC=clang MOREFLAGS="-Werror -Wimplicit-fallthrough -O0" make -C lib -j libzstd.a ZSTD_LEGACY_SUPPORT=0 cmake-visual-2019: - runs-on: windows-latest + runs-on: windows-2019 strategy: matrix: include: @@ -198,7 +198,7 @@ jobs: cmake.exe --build . visual-2019: - runs-on: windows-latest + runs-on: windows-2019 strategy: matrix: platform: [x64, Win32] @@ -330,7 +330,7 @@ jobs: LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check mingw-short-test: - runs-on: windows-latest + runs-on: windows-2019 strategy: fail-fast: false matrix: @@ -367,7 +367,7 @@ jobs: visual-runtime-tests: - runs-on: windows-latest + runs-on: windows-2019 strategy: matrix: platform: [x64, Win32] From e653e97f77e7e53867e39ed6ce11dbbde6617337 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dirk=20M=C3=BCller?= Date: Tue, 8 Feb 2022 21:32:42 +0100 Subject: [PATCH 088/472] Implement more gzip compatibility (#3037) -n --no-name is the current behavior already, so we can implement this as a noop. --best is an alias for -9 in gzip add basic cli tests. --- programs/zstd.1 | 11 ++++++ programs/zstd.1.md | 12 +++++++ programs/zstdcli.c | 41 ++++++++++++++++------ tests/cli-tests/compression/gzip-compat.sh | 15 ++++++++ 4 files changed, 69 insertions(+), 10 deletions(-) create mode 100755 tests/cli-tests/compression/gzip-compat.sh diff --git a/programs/zstd.1 b/programs/zstd.1 index c7a19dbac..0e6e016e9 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -217,6 +217,17 @@ If input directory contains "\.\.", the files in this directory will be ignored\ . .IP "" 0 . +.SS "gzip Operation modifiers" +When invoked via a \fBgzip\fR symlink, \fBzstd\fR will support further options that intend to mimic the \fBgzip\fR behavior: +. +.TP +\fB\-n\fR, \fB\-\-no\-name\fR +do not store the original filename and timestamps when compressing a file\. This is the default behavior and hence a no\-op\. +. +.TP +\fB\-\-best\fR +alias to the option \fB\-9\fR\. +. .SS "Restricted usage of Environment Variables" Using environment variables to set parameters has security implications\. Therefore, this avenue is intentionally restricted\. Only \fBZSTD_CLEVEL\fR and \fBZSTD_NBTHREADS\fR are currently supported\. They set the compression level and number of threads to use during compression, respectively\. . diff --git a/programs/zstd.1.md b/programs/zstd.1.md index e343ec044..569ca1aa0 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -280,6 +280,18 @@ the last one takes effect. * `--`: All arguments after `--` are treated as files + +### gzip Operation modifiers +When invoked via a `gzip` symlink, `zstd` will support further +options that intend to mimic the `gzip` behavior: + +* `-n`, `--no-name`: + do not store the original filename and timestamps when compressing + a file. This is the default behavior and hence a no-op. +* `--best`: + alias to the option `-9`. + + ### Restricted usage of Environment Variables Using environment variables to set parameters has security implications. diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 29da261df..0b9b82a98 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -125,6 +125,15 @@ static void checkLibVersion(void) } +/*! exeNameMatch() : + @return : a non-zero value if exeName matches test, excluding the extension + */ +static int exeNameMatch(const char* exeName, const char* test) +{ + return !strncmp(exeName, test, strlen(test)) && + (exeName[strlen(test)] == '\0' || exeName[strlen(test)] == '.'); +} + /*-************************************ * Command Line **************************************/ @@ -153,6 +162,11 @@ static void usage(FILE* f, const char* programName) DISPLAY_F(f, " block devices, etc.\n"); DISPLAY_F(f, "--rm : remove source file(s) after successful de/compression \n"); DISPLAY_F(f, " -k : preserve source file(s) (default) \n"); +#ifdef ZSTD_GZCOMPRESS + if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ + DISPLAY_F(f, " -n : do not store original filename when compressing \n"); + } +#endif DISPLAY_F(f, " -h/-H : display help/long help and exit \n"); } @@ -208,6 +222,12 @@ static void usage_advanced(const char* programName) DISPLAYOUT( "--ultra : enable levels beyond %i, up to %i (requires more memory) \n", ZSTDCLI_CLEVEL_MAX, ZSTD_maxCLevel()); DISPLAYOUT( "--long[=#]: enable long distance matching with given window log (default: %u) \n", g_defaultMaxWindowLog); DISPLAYOUT( "--fast[=#]: switch to very fast compression levels (default: %u) \n", 1); +#ifdef ZSTD_GZCOMPRESS + if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ + DISPLAYOUT( "--best : compatibility alias for -9 \n"); + DISPLAYOUT( "--no-name : do not store original filename when compressing \n"); + } +#endif DISPLAYOUT( "--adapt : dynamically adapt compression level to I/O conditions \n"); DISPLAYOUT( "--[no-]row-match-finder : force enable/disable usage of fast row-based matchfinder for greedy, lazy, and lazy2 strategies \n"); DISPLAYOUT( "--patch-from=FILE : specify the file to be used as a reference point for zstd's diff engine. \n"); @@ -298,15 +318,6 @@ static const char* lastNameFromPath(const char* path) return name; } -/*! exeNameMatch() : - @return : a non-zero value if exeName matches test, excluding the extension - */ -static int exeNameMatch(const char* exeName, const char* test) -{ - return !strncmp(exeName, test, strlen(test)) && - (exeName[strlen(test)] == '\0' || exeName[strlen(test)] == '.'); -} - static void errorOut(const char* msg) { DISPLAY("%s \n", msg); exit(1); @@ -866,7 +877,10 @@ int main(int argCount, const char* argv[]) if (exeNameMatch(programName, ZSTD_UNZSTD)) operation=zom_decompress; if (exeNameMatch(programName, ZSTD_CAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; outFileName=stdoutmark; g_displayLevel=1; } /* supports multiple formats */ if (exeNameMatch(programName, ZSTD_ZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; outFileName=stdoutmark; g_displayLevel=1; } /* behave like zcat, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_GZ)) { suffix = GZ_EXTENSION; FIO_setCompressionType(prefs, FIO_gzipCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like gzip */ + if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ + suffix = GZ_EXTENSION; FIO_setCompressionType(prefs, FIO_gzipCompression); FIO_setRemoveSrcFile(prefs, 1); + dictCLevel = cLevel = 6; /* gzip default is -6 */ + } if (exeNameMatch(programName, ZSTD_GUNZIP)) { operation=zom_decompress; FIO_setRemoveSrcFile(prefs, 1); } /* behave like gunzip, also supports multiple formats */ if (exeNameMatch(programName, ZSTD_GZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; outFileName=stdoutmark; g_displayLevel=1; } /* behave like gzcat, also supports multiple formats */ if (exeNameMatch(programName, ZSTD_LZMA)) { suffix = LZMA_EXTENSION; FIO_setCompressionType(prefs, FIO_lzmaCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like lzma */ @@ -936,6 +950,10 @@ int main(int argCount, const char* argv[]) if (!strcmp(argument, "--format=zstd")) { suffix = ZSTD_EXTENSION; FIO_setCompressionType(prefs, FIO_zstdCompression); continue; } #ifdef ZSTD_GZCOMPRESS if (!strcmp(argument, "--format=gzip")) { suffix = GZ_EXTENSION; FIO_setCompressionType(prefs, FIO_gzipCompression); continue; } + if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ + if (!strcmp(argument, "--best")) { dictCLevel = cLevel = 9; continue; } + if (!strcmp(argument, "--no-name")) { /* ignore for now */; continue; } + } #endif #ifdef ZSTD_LZMACOMPRESS if (!strcmp(argument, "--format=lzma")) { suffix = LZMA_EXTENSION; FIO_setCompressionType(prefs, FIO_lzmaCompression); continue; } @@ -1098,6 +1116,9 @@ int main(int argCount, const char* argv[]) /* Force stdout, even if stdout==console */ case 'c': forceStdout=1; outFileName=stdoutmark; argument++; break; + /* do not store filename - gzip compatibility - nothing to do */ + case 'n': argument++; break; + /* Use file content as dictionary */ case 'D': argument++; NEXT_FIELD(dictFileName); break; diff --git a/tests/cli-tests/compression/gzip-compat.sh b/tests/cli-tests/compression/gzip-compat.sh new file mode 100755 index 000000000..bb72e05fc --- /dev/null +++ b/tests/cli-tests/compression/gzip-compat.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +set -e + +# Uncomment the set -v line for debugging +# set -v + +# Test gzip specific compression option +$ZSTD_SYMLINK_DIR/gzip --fast file ; $ZSTD_SYMLINK_DIR/gzip -d file.gz +$ZSTD_SYMLINK_DIR/gzip --best file ; $ZSTD_SYMLINK_DIR/gzip -d file.gz + +# Test -n / --no-name: do not embed original filename in archive +$ZSTD_SYMLINK_DIR/gzip -n file ; grep -qv file file.gz ; $ZSTD_SYMLINK_DIR/gzip -d file.gz +$ZSTD_SYMLINK_DIR/gzip --no-name file ; grep -qv file file.gz ; $ZSTD_SYMLINK_DIR/gzip -d file.gz +$ZSTD_SYMLINK_DIR/gzip -c --no-name file | grep -qv file From 762898f5e4424a72bdbb3d3847abd598c8be1846 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 8 Feb 2022 11:49:31 -0500 Subject: [PATCH 089/472] Bugfix and new features for largeNbDicts benchmark --- contrib/largeNbDicts/README.md | 24 ++++++++----- contrib/largeNbDicts/largeNbDicts.c | 52 ++++++++++++++--------------- 2 files changed, 42 insertions(+), 34 deletions(-) diff --git a/contrib/largeNbDicts/README.md b/contrib/largeNbDicts/README.md index f29bcdfe8..010102c90 100644 --- a/contrib/largeNbDicts/README.md +++ b/contrib/largeNbDicts/README.md @@ -14,12 +14,20 @@ Command line : ``` largeNbDicts [Options] filename(s) -Options : --r : recursively load all files in subdirectories (default: off) --B# : split input into blocks of size # (default: no split) --# : use compression level # (default: 3) --D # : use # as a dictionary (default: create one) --i# : nb benchmark rounds (default: 6) ---nbDicts=# : set nb of dictionaries to # (default: one per block) --h : help (this text) +Options : +-z : benchmark compression (default) +-d : benchmark decompression +-r : recursively load all files in subdirectories (default: off) +-B# : split input into blocks of size # (default: no split) +-# : use compression level # (default: 3) +-D # : use # as a dictionary (default: create one) +-i# : nb benchmark rounds (default: 6) +--nbBlocks=#: use # blocks for bench (default: one per file) +--nbDicts=# : create # dictionaries for bench (default: one per block) +-h : help (this text) + +Advanced Options (see zstd.h for documentation) : +--dedicated-dict-search +--dict-content-type=# +--dict-attach-pref=# ``` diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index ddbb3e081..ae5383d25 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -39,6 +39,7 @@ #define BLOCKSIZE_DEFAULT 0 /* no slicing into blocks */ #define DICTSIZE (4 KB) #define CLEVEL_DEFAULT 3 +#define DICT_LOAD_METHOD ZSTD_dlm_byCopy #define BENCH_TIME_DEFAULT_S 6 #define RUN_TIME_DEFAULT_MS 1000 @@ -156,19 +157,6 @@ createDictionaryBuffer(const char* dictionaryName, } } -static ZSTD_CDict* createCDictForDedicatedDictSearch(const void* dict, size_t dictSize, int compressionLevel) -{ - ZSTD_CCtx_params* params = ZSTD_createCCtxParams(); - ZSTD_CCtxParams_init(params, compressionLevel); - ZSTD_CCtxParams_setParameter(params, ZSTD_c_enableDedicatedDictSearch, 1); - ZSTD_CCtxParams_setParameter(params, ZSTD_c_compressionLevel, compressionLevel); - - ZSTD_CDict* cdict = ZSTD_createCDict_advanced2(dict, dictSize, ZSTD_dlm_byCopy, ZSTD_dct_auto, params, ZSTD_defaultCMem); - - ZSTD_freeCCtxParams(params); - return cdict; -} - /*! BMK_loadFiles() : * Loads `buffer`, with content from files listed within `fileNamesTable`. * Fills `buffer` entirely. @@ -461,14 +449,12 @@ static void freeCDictCollection(cdict_collection_t cdictc) } /* returns .buffers=NULL if operation fails */ -static cdict_collection_t createCDictCollection(const void* dictBuffer, size_t dictSize, size_t nbCDict, int cLevel, int dedicatedDictSearch) +static cdict_collection_t createCDictCollection(const void* dictBuffer, size_t dictSize, size_t nbCDict, ZSTD_dictContentType_e dictContentType, ZSTD_CCtx_params* cctxParams) { ZSTD_CDict** const cdicts = malloc(nbCDict * sizeof(ZSTD_CDict*)); if (cdicts==NULL) return kNullCDictCollection; for (size_t dictNb=0; dictNb < nbCDict; dictNb++) { - cdicts[dictNb] = dedicatedDictSearch ? - createCDictForDedicatedDictSearch(dictBuffer, dictSize, cLevel) : - ZSTD_createCDict(dictBuffer, dictSize, cLevel); + cdicts[dictNb] = ZSTD_createCDict_advanced2(dictBuffer, dictSize, DICT_LOAD_METHOD, dictContentType, cctxParams, ZSTD_defaultCMem); CONTROL(cdicts[dictNb] != NULL); } cdict_collection_t cdictc; @@ -735,7 +721,7 @@ int bench(const char** fileNameTable, unsigned nbFiles, size_t blockSize, int clevel, unsigned nbDictMax, unsigned nbBlocks, unsigned nbRounds, int benchCompression, - int dedicatedDictSearch) + ZSTD_dictContentType_e dictContentType, ZSTD_CCtx_params* cctxParams) { int result = 0; @@ -786,13 +772,11 @@ int bench(const char** fileNameTable, unsigned nbFiles, /* dictionary determination */ buffer_t const dictBuffer = createDictionaryBuffer(dictionary, srcs.buffer.ptr, - srcs.slices.capacities, srcs.slices.nbSlices, + srcSlices.capacities, srcSlices.nbSlices, DICTSIZE); CONTROL(dictBuffer.ptr != NULL); - ZSTD_CDict* const cdict = dedicatedDictSearch ? - createCDictForDedicatedDictSearch(dictBuffer.ptr, dictBuffer.size, clevel) : - ZSTD_createCDict(dictBuffer.ptr, dictBuffer.size, clevel); + ZSTD_CDict* const cdict = ZSTD_createCDict_advanced2(dictBuffer.ptr, dictBuffer.size, DICT_LOAD_METHOD, dictContentType, cctxParams, ZSTD_defaultCMem); CONTROL(cdict != NULL); size_t const cTotalSizeNoDict = compressBlocks(NULL, dstSlices, srcSlices, NULL, clevel); @@ -815,14 +799,14 @@ int bench(const char** fileNameTable, unsigned nbFiles, unsigned const nbDicts = nbDictMax ? nbDictMax : nbBlocks; - cdict_collection_t const cdictionaries = createCDictCollection(dictBuffer.ptr, dictBuffer.size, nbDicts, clevel, dedicatedDictSearch); + cdict_collection_t const cdictionaries = createCDictCollection(dictBuffer.ptr, dictBuffer.size, nbDicts, dictContentType, cctxParams); CONTROL(cdictionaries.cdicts != NULL); ddict_collection_t const ddictionaries = createDDictCollection(dictBuffer.ptr, dictBuffer.size, nbDicts); CONTROL(ddictionaries.ddicts != NULL); if (benchCompression) { - size_t const dictMem = ZSTD_estimateCDictSize(dictBuffer.size, ZSTD_dlm_byCopy); + size_t const dictMem = ZSTD_estimateCDictSize(dictBuffer.size, DICT_LOAD_METHOD); size_t const allDictMem = dictMem * nbDicts; DISPLAYLEVEL(3, "generating %u dictionaries, using %.1f MB of memory \n", nbDicts, (double)allDictMem / (1 MB)); @@ -836,7 +820,7 @@ int bench(const char** fileNameTable, unsigned nbFiles, freeBufferCollection(resultCollection); } else { - size_t const dictMem = ZSTD_estimateDDictSize(dictBuffer.size, ZSTD_dlm_byCopy); + size_t const dictMem = ZSTD_estimateDDictSize(dictBuffer.size, DICT_LOAD_METHOD); size_t const allDictMem = dictMem * nbDicts; DISPLAYLEVEL(3, "generating %u dictionaries, using %.1f MB of memory \n", nbDicts, (double)allDictMem / (1 MB)); @@ -927,6 +911,11 @@ int usage(const char* exeName) DISPLAY ("--nbBlocks=#: use # blocks for bench (default: one per file) \n"); DISPLAY ("--nbDicts=# : create # dictionaries for bench (default: one per block) \n"); DISPLAY ("-h : help (this text) \n"); + DISPLAY (" \n"); + DISPLAY ("Advanced Options (see zstd.h for documentation) : \n"); + DISPLAY ("--dedicated-dict-search\n"); + DISPLAY ("--dict-content-type=#\n"); + DISPLAY ("--dict-attach-pref=#\n"); return 0; } @@ -956,6 +945,8 @@ int main (int argc, const char** argv) size_t blockSize = BLOCKSIZE_DEFAULT; unsigned nbDicts = 0; /* determine nbDicts automatically: 1 dictionary per block */ unsigned nbBlocks = 0; /* determine nbBlocks automatically, from source and blockSize */ + ZSTD_dictContentType_e dictContentType = ZSTD_dct_auto; + ZSTD_dictAttachPref_e dictAttachPref = ZSTD_dictDefaultAttach; for (int argNb = 1; argNb < argc ; argNb++) { const char* argument = argv[argNb]; @@ -972,6 +963,8 @@ int main (int argc, const char** argv) if (longCommandWArg(&argument, "--nbBlocks=")) { nbBlocks = readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "--clevel=")) { cLevel = (int)readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "--dedicated-dict-search")) { dedicatedDictSearch = 1; continue; } + if (longCommandWArg(&argument, "--dict-content-type=")) { dictContentType = (int)readU32FromChar(&argument); continue; } + if (longCommandWArg(&argument, "--dict-attach-pref=")) { dictAttachPref = (int)readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "-")) { cLevel = (int)readU32FromChar(&argument); continue; } /* anything that's not a command is a filename */ nameTable[nameIdx++] = argument; @@ -989,10 +982,17 @@ int main (int argc, const char** argv) nameTable = NULL; /* UTIL_createFileNamesTable() takes ownership of nameTable */ } - int result = bench(filenameTable->fileNames, (unsigned)filenameTable->tableSize, dictionary, blockSize, cLevel, nbDicts, nbBlocks, nbRounds, benchCompression, dedicatedDictSearch); + ZSTD_CCtx_params* cctxParams = ZSTD_createCCtxParams(); + ZSTD_CCtxParams_init(cctxParams, cLevel); + ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_enableDedicatedDictSearch, dedicatedDictSearch); + ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_nbWorkers, 0); + ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_forceAttachDict, dictAttachPref); + + int result = bench(filenameTable->fileNames, (unsigned)filenameTable->tableSize, dictionary, blockSize, cLevel, nbDicts, nbBlocks, nbRounds, benchCompression, dictContentType, cctxParams); UTIL_freeFileNamesTable(filenameTable); free(nameTable); + ZSTD_freeCCtxParams(cctxParams); return result; } From db2f4a6532532b9d532d7db34212fea3b1fc02f9 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Fri, 21 Jan 2022 11:29:14 -0700 Subject: [PATCH 090/472] Move bitwise builtins into bits.h --- lib/common/bits.h | 212 +++++++++++++++++++++++++ lib/common/bitstream.h | 47 +----- lib/common/entropy_common.c | 41 +---- lib/common/fse_decompress.c | 3 +- lib/common/zstd_internal.h | 92 ----------- lib/compress/fse_compress.c | 9 +- lib/compress/huf_compress.c | 9 +- lib/compress/zstd_compress.c | 1 + lib/compress/zstd_compress_internal.h | 98 +----------- lib/compress/zstd_lazy.c | 43 +---- lib/decompress/huf_decompress.c | 5 +- lib/decompress/zstd_decompress.c | 1 + lib/decompress/zstd_decompress_block.c | 3 +- lib/dictBuilder/cover.c | 1 + lib/dictBuilder/zdict.c | 82 +--------- tests/fuzz/huf_round_trip.c | 3 +- 16 files changed, 250 insertions(+), 400 deletions(-) create mode 100644 lib/common/bits.h diff --git a/lib/common/bits.h b/lib/common/bits.h new file mode 100644 index 000000000..67db5a9e7 --- /dev/null +++ b/lib/common/bits.h @@ -0,0 +1,212 @@ +/* + * Copyright (c) Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under both the BSD-style license (found in the + * LICENSE file in the root directory of this source tree) and the GPLv2 (found + * in the COPYING file in the root directory of this source tree). + * You may select, at your option, one of the above-listed licenses. + */ + +#ifndef ZSTD_BITS_H +#define ZSTD_BITS_H + +#include "mem.h" + +MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ +{ + assert(val != 0); + { +# if defined(_MSC_VER) /* Visual */ +# if STATIC_BMI2 == 1 + return _lzcnt_u32(val)^31; +# else + if (val != 0) { + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */ + return (unsigned)__builtin_clz (val) ^ 31; +# elif defined(__ICCARM__) /* IAR Intrinsic */ + return 31 - __CLZ(val); +# else /* Software version */ + static const U32 DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 }; + U32 v = val; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + return DeBruijnClz[(v * 0x07C4ACDDU) >> 27]; +# endif + } +} + +MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) +{ + assert(val != 0); +# if defined(_MSC_VER) + if (val != 0) { + unsigned long r; + _BitScanForward(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# elif defined(__GNUC__) && (__GNUC__ >= 3) + return (unsigned)__builtin_ctz(val); +# elif defined(__ICCARM__) /* IAR Intrinsic */ + return __CTZ(val); +# else + static const int DeBruijnBytePos[32] = { 0, 1, 28, 2, 29, 14, 24, 3, + 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, + 26, 12, 18, 6, 11, 5, 10, 9 }; + return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; +# endif +} + +MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) +{ + assert(val != 0); +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 + return _tzcnt_u64(val); +# else + if (val != 0) { + unsigned long r; + _BitScanForward64(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + if (MEM_32bits()) { + U32 mostSignificantWord = (U32)(val >> 32); + U32 leastSignificantWord = (U32)val; + if (leastSignificantWord == 0) { + return 32 + (unsigned)__builtin_ctz(mostSignificantWord); + } else { + return (unsigned)__builtin_ctz(leastSignificantWord); + } + } else { + return (unsigned)__builtin_ctzll(val); + } +# else + static const int DeBruijnBytePos[64] = { 0, 1, 2, 7, 3, 13, 8, 19, + 4, 25, 14, 28, 9, 34, 20, 56, + 5, 17, 26, 54, 15, 41, 29, 43, + 10, 31, 38, 35, 21, 45, 49, 57, + 63, 6, 12, 18, 24, 27, 33, 55, + 16, 53, 40, 42, 30, 37, 44, 48, + 62, 11, 23, 32, 52, 39, 36, 47, + 61, 22, 51, 46, 60, 50, 59, 58 }; + return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; +# endif +} + +MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) +{ + if (MEM_isLittleEndian()) { + if (MEM_64bits()) { +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 + return _tzcnt_u64(val) >> 3; +# else + if (val != 0) { + unsigned long r; + _BitScanForward64(&r, (U64)val); + return (unsigned)(r >> 3); + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)(__builtin_ctzll((U64)val) >> 3); +# else + static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, + 0, 3, 1, 3, 1, 4, 2, 7, + 0, 2, 3, 6, 1, 5, 3, 5, + 1, 3, 4, 4, 2, 5, 6, 7, + 7, 0, 1, 2, 3, 3, 4, 6, + 2, 6, 5, 5, 3, 4, 5, 6, + 7, 1, 2, 4, 6, 4, 4, 5, + 7, 2, 6, 5, 7, 6, 7, 7 }; + return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; +# endif + } else { /* 32 bits */ +# if defined(_MSC_VER) + if (val != 0) { + unsigned long r; + _BitScanForward(&r, (U32)val); + return (unsigned)(r >> 3); + } else { + /* Should not reach this code path */ + __assume(0); + } +# elif defined(__GNUC__) && (__GNUC__ >= 3) + return (unsigned)(__builtin_ctz((U32)val) >> 3); +# else + static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, + 3, 2, 2, 1, 3, 2, 0, 1, + 3, 3, 1, 2, 2, 2, 2, 0, + 3, 1, 2, 0, 1, 0, 1, 1 }; + return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; +# endif + } + } else { /* Big Endian CPU */ + if (MEM_64bits()) { +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 + return _lzcnt_u64(val) >> 3; +# else + if (val != 0) { + unsigned long r; + _BitScanReverse64(&r, (U64)val); + return (unsigned)(r >> 3); + } else { + /* Should not reach this code path */ + __assume(0); + } +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)(__builtin_clzll(val) >> 3); +# else + unsigned r; + const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */ + if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; } + if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + r += (!val); + return r; +# endif + } else { /* 32 bits */ +# if defined(_MSC_VER) + if (val != 0) { + unsigned long r; + _BitScanReverse(&r, (unsigned long)val); + return (unsigned)(r >> 3); + } else { + /* Should not reach this code path */ + __assume(0); + } +# elif defined(__GNUC__) && (__GNUC__ >= 3) + return (unsigned)(__builtin_clz((U32)val) >> 3); +# else + unsigned r; + if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } + r += (!val); + return r; +# endif + } } +} + +#endif /* ZSTD_BITS_H */ diff --git a/lib/common/bitstream.h b/lib/common/bitstream.h index 84b6062ff..103b37832 100644 --- a/lib/common/bitstream.h +++ b/lib/common/bitstream.h @@ -30,6 +30,7 @@ extern "C" { #include "compiler.h" /* UNLIKELY() */ #include "debug.h" /* assert(), DEBUGLOG(), RAWLOG() */ #include "error_private.h" /* error codes and messages */ +#include "bits.h" /* ZSTD_highbit32 */ /*========================================= @@ -132,48 +133,6 @@ MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC); MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits); /* faster, but works only if nbBits >= 1 */ - - -/*-************************************************************** -* Internal functions -****************************************************************/ -MEM_STATIC unsigned BIT_highbit32 (U32 val) -{ - assert(val != 0); - { -# if defined(_MSC_VER) /* Visual */ -# if STATIC_BMI2 == 1 - return _lzcnt_u32(val) ^ 31; -# else - if (val != 0) { - unsigned long r; - _BitScanReverse(&r, val); - return (unsigned)r; - } else { - /* Should not reach this code path */ - __assume(0); - } -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */ - return __builtin_clz (val) ^ 31; -# elif defined(__ICCARM__) /* IAR Intrinsic */ - return 31 - __CLZ(val); -# else /* Software version */ - static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, - 11, 14, 16, 18, 22, 25, 3, 30, - 8, 12, 20, 28, 15, 17, 24, 7, - 19, 27, 23, 6, 26, 5, 4, 31 }; - U32 v = val; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - return DeBruijnClz[ (U32) (v * 0x07C4ACDDU) >> 27]; -# endif - } -} - /*===== Local Constants =====*/ static const unsigned BIT_mask[] = { 0, 1, 3, 7, 0xF, 0x1F, @@ -291,7 +250,7 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si bitD->ptr = (const char*)srcBuffer + srcSize - sizeof(bitD->bitContainer); bitD->bitContainer = MEM_readLEST(bitD->ptr); { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1]; - bitD->bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0; /* ensures bitsConsumed is always set */ + bitD->bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; /* ensures bitsConsumed is always set */ if (lastByte == 0) return ERROR(GENERIC); /* endMark not present */ } } else { bitD->ptr = bitD->start; @@ -319,7 +278,7 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si default: break; } { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1]; - bitD->bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0; + bitD->bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; if (lastByte == 0) return ERROR(corruption_detected); /* endMark not present */ } bitD->bitsConsumed += (U32)(sizeof(bitD->bitContainer) - srcSize)*8; diff --git a/lib/common/entropy_common.c b/lib/common/entropy_common.c index 4229b40c5..98bd4238d 100644 --- a/lib/common/entropy_common.c +++ b/lib/common/entropy_common.c @@ -21,6 +21,7 @@ #include "fse.h" #define HUF_STATIC_LINKING_ONLY /* HUF_TABLELOG_ABSOLUTEMAX */ #include "huf.h" +#include "bits.h" /* ZSDT_highbit32, ZSTD_countTrailingZeros32 */ /*=== Version ===*/ @@ -38,34 +39,6 @@ const char* HUF_getErrorName(size_t code) { return ERR_getErrorName(code); } /*-************************************************************** * FSE NCount encoding-decoding ****************************************************************/ -static U32 FSE_ctz(U32 val) -{ - assert(val != 0); - { -# if defined(_MSC_VER) /* Visual */ - if (val != 0) { - unsigned long r; - _BitScanForward(&r, val); - return (unsigned)r; - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */ - return __builtin_ctz(val); -# elif defined(__ICCARM__) /* IAR Intrinsic */ - return __CTZ(val); -# else /* Software version */ - U32 count = 0; - while ((val & 1) == 0) { - val >>= 1; - ++count; - } - return count; -# endif - } -} - FORCE_INLINE_TEMPLATE size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, const void* headerBuffer, size_t hbSize) @@ -113,7 +86,7 @@ size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigne * repeat. * Avoid UB by setting the high bit to 1. */ - int repeats = FSE_ctz(~bitStream | 0x80000000) >> 1; + int repeats = ZSTD_countTrailingZeros32(~bitStream | 0x80000000) >> 1; while (repeats >= 12) { charnum += 3 * 12; if (LIKELY(ip <= iend-7)) { @@ -124,7 +97,7 @@ size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigne ip = iend - 4; } bitStream = MEM_readLE32(ip) >> bitCount; - repeats = FSE_ctz(~bitStream | 0x80000000) >> 1; + repeats = ZSTD_countTrailingZeros32(~bitStream | 0x80000000) >> 1; } charnum += 3 * repeats; bitStream >>= 2 * repeats; @@ -189,7 +162,7 @@ size_t FSE_readNCount_body(short* normalizedCounter, unsigned* maxSVPtr, unsigne * know that threshold > 1. */ if (remaining <= 1) break; - nbBits = BIT_highbit32(remaining) + 1; + nbBits = ZSTD_highbit32(remaining) + 1; threshold = 1 << (nbBits - 1); } if (charnum >= maxSV1) break; @@ -312,14 +285,14 @@ HUF_readStats_body(BYTE* huffWeight, size_t hwSize, U32* rankStats, if (weightTotal == 0) return ERROR(corruption_detected); /* get last non-null symbol weight (implied, total must be 2^n) */ - { U32 const tableLog = BIT_highbit32(weightTotal) + 1; + { U32 const tableLog = ZSTD_highbit32(weightTotal) + 1; if (tableLog > HUF_TABLELOG_MAX) return ERROR(corruption_detected); *tableLogPtr = tableLog; /* determine last weight */ { U32 const total = 1 << tableLog; U32 const rest = total - weightTotal; - U32 const verif = 1 << BIT_highbit32(rest); - U32 const lastWeight = BIT_highbit32(rest) + 1; + U32 const verif = 1 << ZSTD_highbit32(rest); + U32 const lastWeight = ZSTD_highbit32(rest) + 1; if (verif != rest) return ERROR(corruption_detected); /* last value must be a clean power of 2 */ huffWeight[oSize] = (BYTE)lastWeight; rankStats[lastWeight]++; diff --git a/lib/common/fse_decompress.c b/lib/common/fse_decompress.c index bc0c1be2f..184b35dd1 100644 --- a/lib/common/fse_decompress.c +++ b/lib/common/fse_decompress.c @@ -24,6 +24,7 @@ #include "error_private.h" #define ZSTD_DEPS_NEED_MALLOC #include "zstd_deps.h" +#include "bits.h" /* ZSTD_highbit32 */ /* ************************************************************** @@ -166,7 +167,7 @@ static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCo for (u=0; u= 3) /* GCC Intrinsic */ - return (U32)__builtin_clz (val) ^ 31; -# elif defined(__ICCARM__) /* IAR Intrinsic */ - return 31 - __CLZ(val); -# else /* Software version */ - static const U32 DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 }; - U32 v = val; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - return DeBruijnClz[(v * 0x07C4ACDDU) >> 27]; -# endif - } -} - -/** - * Counts the number of trailing zeros of a `size_t`. - * Most compilers should support CTZ as a builtin. A backup - * implementation is provided if the builtin isn't supported, but - * it may not be terribly efficient. - */ -MEM_STATIC unsigned ZSTD_countTrailingZeros(size_t val) -{ - if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) -# if STATIC_BMI2 - return _tzcnt_u64(val); -# else - if (val != 0) { - unsigned long r; - _BitScanForward64(&r, (U64)val); - return (unsigned)r; - } else { - /* Should not reach this code path */ - __assume(0); - } -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 4) - return (unsigned)__builtin_ctzll((U64)val); -# else - static const int DeBruijnBytePos[64] = { 0, 1, 2, 7, 3, 13, 8, 19, - 4, 25, 14, 28, 9, 34, 20, 56, - 5, 17, 26, 54, 15, 41, 29, 43, - 10, 31, 38, 35, 21, 45, 49, 57, - 63, 6, 12, 18, 24, 27, 33, 55, - 16, 53, 40, 42, 30, 37, 44, 48, - 62, 11, 23, 32, 52, 39, 36, 47, - 61, 22, 51, 46, 60, 50, 59, 58 }; - return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - if (val != 0) { - unsigned long r; - _BitScanForward(&r, (U32)val); - return (unsigned)r; - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (unsigned)__builtin_ctz((U32)val); -# else - static const int DeBruijnBytePos[32] = { 0, 1, 28, 2, 29, 14, 24, 3, - 30, 22, 20, 15, 25, 17, 4, 8, - 31, 27, 13, 23, 21, 19, 16, 7, - 26, 12, 18, 6, 11, 5, 10, 9 }; - return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; -# endif - } -} - - /* ZSTD_invalidateRepCodes() : * ensures next compression will not use repcodes from previous block. * Note : only works with regular variant; diff --git a/lib/compress/fse_compress.c b/lib/compress/fse_compress.c index 5547b4ac0..21be8c54f 100644 --- a/lib/compress/fse_compress.c +++ b/lib/compress/fse_compress.c @@ -26,6 +26,7 @@ #define ZSTD_DEPS_NEED_MALLOC #define ZSTD_DEPS_NEED_MATH64 #include "../common/zstd_deps.h" /* ZSTD_malloc, ZSTD_free, ZSTD_memcpy, ZSTD_memset */ +#include "../common/bits.h" /* ZSTD_highbit32 */ /* ************************************************************** @@ -191,7 +192,7 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, break; default : assert(normalizedCounter[s] > 1); - { U32 const maxBitsOut = tableLog - BIT_highbit32 ((U32)normalizedCounter[s]-1); + { U32 const maxBitsOut = tableLog - ZSTD_highbit32 ((U32)normalizedCounter[s]-1); U32 const minStatePlus = (U32)normalizedCounter[s] << maxBitsOut; symbolTT[s].deltaNbBits = (maxBitsOut << 16) - minStatePlus; symbolTT[s].deltaFindState = (int)(total - (unsigned)normalizedCounter[s]); @@ -355,8 +356,8 @@ void FSE_freeCTable (FSE_CTable* ct) { ZSTD_free(ct); } /* provides the minimum logSize to safely represent a distribution */ static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue) { - U32 minBitsSrc = BIT_highbit32((U32)(srcSize)) + 1; - U32 minBitsSymbols = BIT_highbit32(maxSymbolValue) + 2; + U32 minBitsSrc = ZSTD_highbit32((U32)(srcSize)) + 1; + U32 minBitsSymbols = ZSTD_highbit32(maxSymbolValue) + 2; U32 minBits = minBitsSrc < minBitsSymbols ? minBitsSrc : minBitsSymbols; assert(srcSize > 1); /* Not supported, RLE should be used instead */ return minBits; @@ -364,7 +365,7 @@ static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue) unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus) { - U32 maxBitsSrc = BIT_highbit32((U32)(srcSize - 1)) - minus; + U32 maxBitsSrc = ZSTD_highbit32((U32)(srcSize - 1)) - minus; U32 tableLog = maxTableLog; U32 minBits = FSE_minTableLog(srcSize, maxSymbolValue); assert(srcSize > 1); /* Not supported, RLE should be used instead */ diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c index a8677733b..5d90c162e 100644 --- a/lib/compress/huf_compress.c +++ b/lib/compress/huf_compress.c @@ -32,6 +32,7 @@ #define HUF_STATIC_LINKING_ONLY #include "../common/huf.h" #include "../common/error_private.h" +#include "../common/bits.h" /* ZSTD_highbit32 */ /* ************************************************************** @@ -407,7 +408,7 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 targetNbBits /* Try to reduce the next power of 2 above totalCost because we * gain back half the rank. */ - U32 nBitsToDecrease = BIT_highbit32((U32)totalCost) + 1; + U32 nBitsToDecrease = ZSTD_highbit32((U32)totalCost) + 1; for ( ; nBitsToDecrease > 1; nBitsToDecrease--) { U32 const highPos = rankLast[nBitsToDecrease]; U32 const lowPos = rankLast[nBitsToDecrease-1]; @@ -505,7 +506,7 @@ typedef struct { */ #define RANK_POSITION_MAX_COUNT_LOG 32 #define RANK_POSITION_LOG_BUCKETS_BEGIN (RANK_POSITION_TABLE_SIZE - 1) - RANK_POSITION_MAX_COUNT_LOG - 1 /* == 158 */ -#define RANK_POSITION_DISTINCT_COUNT_CUTOFF RANK_POSITION_LOG_BUCKETS_BEGIN + BIT_highbit32(RANK_POSITION_LOG_BUCKETS_BEGIN) /* == 166 */ +#define RANK_POSITION_DISTINCT_COUNT_CUTOFF RANK_POSITION_LOG_BUCKETS_BEGIN + ZSTD_highbit32(RANK_POSITION_LOG_BUCKETS_BEGIN) /* == 166 */ /* Return the appropriate bucket index for a given count. See definition of * RANK_POSITION_DISTINCT_COUNT_CUTOFF for explanation of bucketing strategy. @@ -513,7 +514,7 @@ typedef struct { static U32 HUF_getIndex(U32 const count) { return (count < RANK_POSITION_DISTINCT_COUNT_CUTOFF) ? count - : BIT_highbit32(count) + RANK_POSITION_LOG_BUCKETS_BEGIN; + : ZSTD_highbit32(count) + RANK_POSITION_LOG_BUCKETS_BEGIN; } /* Helper swap function for HUF_quickSortPartition() */ @@ -870,7 +871,7 @@ FORCE_INLINE_TEMPLATE void HUF_addBits(HUF_CStream_t* bitC, HUF_CElt elt, int id #if DEBUGLEVEL >= 1 { size_t const nbBits = HUF_getNbBits(elt); - size_t const dirtyBits = nbBits == 0 ? 0 : BIT_highbit32((U32)nbBits) + 1; + size_t const dirtyBits = nbBits == 0 ? 0 : ZSTD_highbit32((U32)nbBits) + 1; (void)dirtyBits; /* Middle bits are 0. */ assert(((elt >> dirtyBits) << (dirtyBits + nbBits)) == 0); diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 37b6e2ff4..aa1a9f35b 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -27,6 +27,7 @@ #include "zstd_opt.h" #include "zstd_ldm.h" #include "zstd_compress_superblock.h" +#include "../common/bits.h" /* ZSTD_highbit32 */ /* *************************************************************** * Tuning parameters diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index f027f4612..bbae53303 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -23,6 +23,7 @@ #ifdef ZSTD_MULTITHREAD # include "zstdmt_compress.h" #endif +#include "../common/bits.h" /* ZSTD_highbit32, ZSTD_NbCommonBytes */ #if defined (__cplusplus) extern "C" { @@ -699,103 +700,6 @@ ZSTD_newRep(U32 const rep[ZSTD_REP_NUM], U32 const offBase, U32 const ll0) /*-************************************* * Match length counter ***************************************/ -static unsigned ZSTD_NbCommonBytes (size_t val) -{ - if (MEM_isLittleEndian()) { - if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) -# if STATIC_BMI2 - return _tzcnt_u64(val) >> 3; -# else - if (val != 0) { - unsigned long r; - _BitScanForward64(&r, (U64)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 4) - return (unsigned)(__builtin_ctzll((U64)val) >> 3); -# else - static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, - 0, 3, 1, 3, 1, 4, 2, 7, - 0, 2, 3, 6, 1, 5, 3, 5, - 1, 3, 4, 4, 2, 5, 6, 7, - 7, 0, 1, 2, 3, 3, 4, 6, - 2, 6, 5, 5, 3, 4, 5, 6, - 7, 1, 2, 4, 6, 4, 4, 5, - 7, 2, 6, 5, 7, 6, 7, 7 }; - return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - if (val != 0) { - unsigned long r; - _BitScanForward(&r, (U32)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (unsigned)(__builtin_ctz((U32)val) >> 3); -# else - static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, - 3, 2, 2, 1, 3, 2, 0, 1, - 3, 3, 1, 2, 2, 2, 2, 0, - 3, 1, 2, 0, 1, 0, 1, 1 }; - return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; -# endif - } - } else { /* Big Endian CPU */ - if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) -# if STATIC_BMI2 - return _lzcnt_u64(val) >> 3; -# else - if (val != 0) { - unsigned long r; - _BitScanReverse64(&r, (U64)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 4) - return (unsigned)(__builtin_clzll(val) >> 3); -# else - unsigned r; - const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */ - if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; } - if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } - r += (!val); - return r; -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - if (val != 0) { - unsigned long r; - _BitScanReverse(&r, (unsigned long)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (unsigned)(__builtin_clz((U32)val) >> 3); -# else - unsigned r; - if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } - r += (!val); - return r; -# endif - } } -} - - MEM_STATIC size_t ZSTD_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* const pInLimit) { const BYTE* const pStart = pIn; diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 47c0687c9..c619aea3a 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -10,6 +10,7 @@ #include "zstd_compress_internal.h" #include "zstd_lazy.h" +#include "../common/bits.h" /* ZSTD_countTrailingZeros64 */ /*-************************************* @@ -765,44 +766,6 @@ size_t ZSTD_HcFindBestMatch( typedef U64 ZSTD_VecMask; /* Clarifies when we are interacting with a U64 representing a mask of matches */ -/* ZSTD_VecMask_next(): - * Starting from the LSB, returns the idx of the next non-zero bit. - * Basically counting the nb of trailing zeroes. - */ -static U32 ZSTD_VecMask_next(ZSTD_VecMask val) { - assert(val != 0); -# if defined(_MSC_VER) && defined(_WIN64) - if (val != 0) { - unsigned long r; - _BitScanForward64(&r, val); - return (U32)(r); - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif (defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)))) - if (sizeof(size_t) == 4) { - U32 mostSignificantWord = (U32)(val >> 32); - U32 leastSignificantWord = (U32)val; - if (leastSignificantWord == 0) { - return 32 + (U32)__builtin_ctz(mostSignificantWord); - } else { - return (U32)__builtin_ctz(leastSignificantWord); - } - } else { - return (U32)__builtin_ctzll(val); - } -# else - /* Software ctz version: http://aggregate.org/MAGIC/#Trailing%20Zero%20Count - * and: https://stackoverflow.com/questions/2709430/count-number-of-bits-in-a-64-bit-long-big-integer - */ - val = ~val & (val - 1ULL); /* Lowest set bit mask */ - val = val - ((val >> 1) & 0x5555555555555555); - val = (val & 0x3333333333333333ULL) + ((val >> 2) & 0x3333333333333333ULL); - return (U32)((((val + (val >> 4)) & 0xF0F0F0F0F0F0F0FULL) * 0x101010101010101ULL) >> 56); -# endif -} - /* ZSTD_rotateRight_*(): * Rotates a bitfield to the right by "count" bits. * https://en.wikipedia.org/w/index.php?title=Circular_shift&oldid=991635599#Implementing_circular_shifts @@ -1202,7 +1165,7 @@ size_t ZSTD_RowFindBestMatch( /* Cycle through the matches and prefetch */ for (; (matches > 0) && (nbAttempts > 0); --nbAttempts, matches &= (matches - 1)) { - U32 const matchPos = (head + ZSTD_VecMask_next(matches)) & rowMask; + U32 const matchPos = (head + ZSTD_countTrailingZeros64(matches)) & rowMask; U32 const matchIndex = row[matchPos]; assert(numMatches < rowEntries); if (matchIndex < lowLimit) @@ -1270,7 +1233,7 @@ size_t ZSTD_RowFindBestMatch( ZSTD_VecMask matches = ZSTD_row_getMatchMask(dmsTagRow, (BYTE)dmsTag, head, rowEntries); for (; (matches > 0) && (nbAttempts > 0); --nbAttempts, matches &= (matches - 1)) { - U32 const matchPos = (head + ZSTD_VecMask_next(matches)) & rowMask; + U32 const matchPos = (head + ZSTD_countTrailingZeros64(matches)) & rowMask; U32 const matchIndex = dmsRow[matchPos]; if (matchIndex < dmsLowestIndex) break; diff --git a/lib/decompress/huf_decompress.c b/lib/decompress/huf_decompress.c index 202718825..4541ca98c 100644 --- a/lib/decompress/huf_decompress.c +++ b/lib/decompress/huf_decompress.c @@ -23,6 +23,7 @@ #include "../common/huf.h" #include "../common/error_private.h" #include "../common/zstd_internal.h" +#include "../common/bits.h" /* ZSTD_highbit32, ZSTD_countTrailingZeros64 */ /* ************************************************************** * Constants @@ -142,7 +143,7 @@ static DTableDesc HUF_getDTableDesc(const HUF_DTable* table) static size_t HUF_initDStream(BYTE const* ip) { BYTE const lastByte = ip[7]; - size_t const bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0; + size_t const bitsConsumed = lastByte ? 8 - ZSTD_highbit32(lastByte) : 0; size_t const value = MEM_readLEST(ip) | 1; assert(bitsConsumed <= 8); return value << bitsConsumed; @@ -263,7 +264,7 @@ static size_t HUF_initRemainingDStream(BIT_DStream_t* bit, HUF_DecompressAsmArgs /* Construct the BIT_DStream_t. */ bit->bitContainer = MEM_readLE64(args->ip[stream]); - bit->bitsConsumed = ZSTD_countTrailingZeros((size_t)args->bits[stream]); + bit->bitsConsumed = ZSTD_countTrailingZeros64(args->bits[stream]); bit->start = (const char*)args->iend[0]; bit->limitPtr = bit->start + sizeof(size_t); bit->ptr = (const char*)args->ip[stream]; diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index 44649dd37..8950453f4 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -66,6 +66,7 @@ #include "zstd_decompress_internal.h" /* ZSTD_DCtx */ #include "zstd_ddict.h" /* ZSTD_DDictDictContent */ #include "zstd_decompress_block.h" /* ZSTD_decompressBlock_internal */ +#include "../common/bits.h" /* ZSTD_highbit32 */ #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) # include "../legacy/zstd_legacy.h" diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index 758c7ad99..6f8a75f53 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -26,6 +26,7 @@ #include "zstd_decompress_internal.h" /* ZSTD_DCtx */ #include "zstd_ddict.h" /* ZSTD_DDictDictContent */ #include "zstd_decompress_block.h" +#include "../common/bits.h" /* ZSTD_highbit32 */ /*_******************************************************* * Macros @@ -551,7 +552,7 @@ void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, for (u=0; u> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (unsigned)(__builtin_ctzll((U64)val) >> 3); -# else - static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, 0, 3, 1, 3, 1, 4, 2, 7, 0, 2, 3, 6, 1, 5, 3, 5, 1, 3, 4, 4, 2, 5, 6, 7, 7, 0, 1, 2, 3, 3, 4, 6, 2, 6, 5, 5, 3, 4, 5, 6, 7, 1, 2, 4, 6, 4, 4, 5, 7, 2, 6, 5, 7, 6, 7, 7 }; - return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - if (val != 0) { - unsigned long r; - _BitScanForward(&r, (U32)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (unsigned)(__builtin_ctz((U32)val) >> 3); -# else - static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 }; - return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; -# endif - } - } else { /* Big Endian CPU */ - if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) - if (val != 0) { - unsigned long r; - _BitScanReverse64(&r, val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (unsigned)(__builtin_clzll(val) >> 3); -# else - unsigned r; - const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */ - if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; } - if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } - r += (!val); - return r; -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - if (val != 0) { - unsigned long r; - _BitScanReverse(&r, (unsigned long)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (unsigned)(__builtin_clz((U32)val) >> 3); -# else - unsigned r; - if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } - r += (!val); - return r; -# endif - } } -} - - /*! ZDICT_count() : Count the nb of common bytes between 2 pointers. Note : this function presumes end of buffer followed by noisy guard band. @@ -223,7 +145,7 @@ static size_t ZDICT_count(const void* pIn, const void* pMatch) pMatch = (const char*)pMatch+sizeof(size_t); continue; } - pIn = (const char*)pIn+ZDICT_NbCommonBytes(diff); + pIn = (const char*)pIn+ZSTD_NbCommonBytes(diff); return (size_t)((const char*)pIn - pStart); } } diff --git a/tests/fuzz/huf_round_trip.c b/tests/fuzz/huf_round_trip.c index 0e26ca9b5..bda9a9842 100644 --- a/tests/fuzz/huf_round_trip.c +++ b/tests/fuzz/huf_round_trip.c @@ -24,11 +24,12 @@ #include "common/huf.h" #include "fuzz_helpers.h" #include "fuzz_data_producer.h" +#include "common/bits.h" static size_t adjustTableLog(size_t tableLog, size_t maxSymbol) { size_t const alphabetSize = maxSymbol + 1; - size_t minTableLog = BIT_highbit32(alphabetSize) + 1; + size_t minTableLog = ZSTD_highbit32(alphabetSize) + 1; if ((alphabetSize & (alphabetSize - 1)) != 0) { ++minTableLog; } From 796182652d652d57fca9ece6c63715db2d0e0858 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Mon, 31 Jan 2022 14:59:51 -0500 Subject: [PATCH 091/472] Pull out software fallbacks --- lib/common/bits.h | 124 +++++++++++++++++++++++++++++----------------- lib/common/mem.h | 34 ++++++++----- 2 files changed, 100 insertions(+), 58 deletions(-) diff --git a/lib/common/bits.h b/lib/common/bits.h index 67db5a9e7..65fb456db 100644 --- a/lib/common/bits.h +++ b/lib/common/bits.h @@ -13,6 +13,19 @@ #include "mem.h" +MEM_STATIC unsigned ZSTD_highbit32_fallback(U32 val) { + static const U32 DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, + 11, 14, 16, 18, 22, 25, 3, 30, + 8, 12, 20, 28, 15, 17, 24, 7, + 19, 27, 23, 6, 26, 5, 4, 31 }; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + return DeBruijnClz[(val * 0x07C4ACDDU) >> 27]; +} + MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ { assert(val != 0); @@ -35,18 +48,20 @@ MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCo # elif defined(__ICCARM__) /* IAR Intrinsic */ return 31 - __CLZ(val); # else /* Software version */ - static const U32 DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 }; - U32 v = val; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - return DeBruijnClz[(v * 0x07C4ACDDU) >> 27]; + return ZSTD_highbit32_fallback(val); # endif } } +MEM_STATIC unsigned ZSTD_countTrailingZeros32_fallback(U32 val) +{ + static const int DeBruijnBytePos[32] = { 0, 1, 28, 2, 29, 14, 24, 3, + 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, + 26, 12, 18, 6, 11, 5, 10, 9 }; + return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; +} + MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) { assert(val != 0); @@ -64,14 +79,23 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) # elif defined(__ICCARM__) /* IAR Intrinsic */ return __CTZ(val); # else - static const int DeBruijnBytePos[32] = { 0, 1, 28, 2, 29, 14, 24, 3, - 30, 22, 20, 15, 25, 17, 4, 8, - 31, 27, 13, 23, 21, 19, 16, 7, - 26, 12, 18, 6, 11, 5, 10, 9 }; - return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; + return ZSTD_countTrailingZeros32_fallback(val); # endif } +MEM_STATIC unsigned ZSTD_countTrailingZeros64_fallback(U64 val) +{ + static const int DeBruijnBytePos[64] = { 0, 1, 2, 7, 3, 13, 8, 19, + 4, 25, 14, 28, 9, 34, 20, 56, + 5, 17, 26, 54, 15, 41, 29, 43, + 10, 31, 38, 35, 21, 45, 49, 57, + 63, 6, 12, 18, 24, 27, 33, 55, + 16, 53, 40, 42, 30, 37, 44, 48, + 62, 11, 23, 32, 52, 39, 36, 47, + 61, 22, 51, 46, 60, 50, 59, 58 }; + return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; +} + MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) { assert(val != 0); @@ -101,18 +125,46 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) return (unsigned)__builtin_ctzll(val); } # else - static const int DeBruijnBytePos[64] = { 0, 1, 2, 7, 3, 13, 8, 19, - 4, 25, 14, 28, 9, 34, 20, 56, - 5, 17, 26, 54, 15, 41, 29, 43, - 10, 31, 38, 35, 21, 45, 49, 57, - 63, 6, 12, 18, 24, 27, 33, 55, - 16, 53, 40, 42, 30, 37, 44, 48, - 62, 11, 23, 32, 52, 39, 36, 47, - 61, 22, 51, 46, 60, 50, 59, 58 }; - return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; + return ZSTD_countTrailingZeros64_fallback(val); # endif } +MEM_STATIC unsigned ZSTD_NbCommonBytes_fallback(size_t val) +{ + if (MEM_isLittleEndian()) { + if (MEM_64bits()) { + static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, + 0, 3, 1, 3, 1, 4, 2, 7, + 0, 2, 3, 6, 1, 5, 3, 5, + 1, 3, 4, 4, 2, 5, 6, 7, + 7, 0, 1, 2, 3, 3, 4, 6, + 2, 6, 5, 5, 3, 4, 5, 6, + 7, 1, 2, 4, 6, 4, 4, 5, + 7, 2, 6, 5, 7, 6, 7, 7 }; + return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; + } else { /* 32 bits */ + static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, + 3, 2, 2, 1, 3, 2, 0, 1, + 3, 3, 1, 2, 2, 2, 2, 0, + 3, 1, 2, 0, 1, 0, 1, 1 }; + return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; + } + } else { /* Big Endian CPU */ + unsigned r; + if (MEM_64bits()) { + const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */ + if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; } + if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + r += (!val); + return r; + } else { /* 32 bits */ + if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } + r += (!val); + return r; + } + } +} + MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) { if (MEM_isLittleEndian()) { @@ -133,15 +185,7 @@ MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) # elif defined(__GNUC__) && (__GNUC__ >= 4) return (unsigned)(__builtin_ctzll((U64)val) >> 3); # else - static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, - 0, 3, 1, 3, 1, 4, 2, 7, - 0, 2, 3, 6, 1, 5, 3, 5, - 1, 3, 4, 4, 2, 5, 6, 7, - 7, 0, 1, 2, 3, 3, 4, 6, - 2, 6, 5, 5, 3, 4, 5, 6, - 7, 1, 2, 4, 6, 4, 4, 5, - 7, 2, 6, 5, 7, 6, 7, 7 }; - return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; + return ZSTD_NbCommonBytes_fallback(val); # endif } else { /* 32 bits */ # if defined(_MSC_VER) @@ -156,11 +200,7 @@ MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) # elif defined(__GNUC__) && (__GNUC__ >= 3) return (unsigned)(__builtin_ctz((U32)val) >> 3); # else - static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, - 3, 2, 2, 1, 3, 2, 0, 1, - 3, 3, 1, 2, 2, 2, 2, 0, - 3, 1, 2, 0, 1, 0, 1, 1 }; - return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; + return ZSTD_NbCommonBytes_fallback(val); # endif } } else { /* Big Endian CPU */ @@ -181,12 +221,7 @@ MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) # elif defined(__GNUC__) && (__GNUC__ >= 4) return (unsigned)(__builtin_clzll(val) >> 3); # else - unsigned r; - const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */ - if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; } - if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } - r += (!val); - return r; + return ZSTD_NbCommonBytes_fallback(val); # endif } else { /* 32 bits */ # if defined(_MSC_VER) @@ -201,10 +236,7 @@ MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) # elif defined(__GNUC__) && (__GNUC__ >= 3) return (unsigned)(__builtin_clz((U32)val) >> 3); # else - unsigned r; - if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } - r += (!val); - return r; + return ZSTD_NbCommonBytes_fallback(val); # endif } } } diff --git a/lib/common/mem.h b/lib/common/mem.h index 85581c384..4b10f7c1f 100644 --- a/lib/common/mem.h +++ b/lib/common/mem.h @@ -257,6 +257,14 @@ MEM_STATIC void MEM_write64(void* memPtr, U64 value) #endif /* MEM_FORCE_MEMORY_ACCESS */ +MEM_STATIC U32 MEM_swap32_fallback(U32 in) +{ + return ((in << 24) & 0xff000000 ) | + ((in << 8) & 0x00ff0000 ) | + ((in >> 8) & 0x0000ff00 ) | + ((in >> 24) & 0x000000ff ); +} + MEM_STATIC U32 MEM_swap32(U32 in) { #if defined(_MSC_VER) /* Visual Studio */ @@ -265,13 +273,22 @@ MEM_STATIC U32 MEM_swap32(U32 in) || (defined(__clang__) && __has_builtin(__builtin_bswap32)) return __builtin_bswap32(in); #else - return ((in << 24) & 0xff000000 ) | - ((in << 8) & 0x00ff0000 ) | - ((in >> 8) & 0x0000ff00 ) | - ((in >> 24) & 0x000000ff ); + return MEM_swap32_fallback(in); #endif } +MEM_STATIC U64 MEM_swap64_fallback(U64 in) +{ + return ((in << 56) & 0xff00000000000000ULL) | + ((in << 40) & 0x00ff000000000000ULL) | + ((in << 24) & 0x0000ff0000000000ULL) | + ((in << 8) & 0x000000ff00000000ULL) | + ((in >> 8) & 0x00000000ff000000ULL) | + ((in >> 24) & 0x0000000000ff0000ULL) | + ((in >> 40) & 0x000000000000ff00ULL) | + ((in >> 56) & 0x00000000000000ffULL); +} + MEM_STATIC U64 MEM_swap64(U64 in) { #if defined(_MSC_VER) /* Visual Studio */ @@ -280,14 +297,7 @@ MEM_STATIC U64 MEM_swap64(U64 in) || (defined(__clang__) && __has_builtin(__builtin_bswap64)) return __builtin_bswap64(in); #else - return ((in << 56) & 0xff00000000000000ULL) | - ((in << 40) & 0x00ff000000000000ULL) | - ((in << 24) & 0x0000ff0000000000ULL) | - ((in << 8) & 0x000000ff00000000ULL) | - ((in >> 8) & 0x00000000ff000000ULL) | - ((in >> 24) & 0x0000000000ff0000ULL) | - ((in >> 40) & 0x000000000000ff00ULL) | - ((in >> 56) & 0x00000000000000ffULL); + return MEM_swap64_fallback(in); #endif } From 529cd7b82174cde8a6ad62a8d6ec666b530cb3ac Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Mon, 7 Feb 2022 12:22:04 -0500 Subject: [PATCH 092/472] Fix nits --- lib/common/bits.h | 251 ++++++++++++-------------------- lib/compress/zstd_lazy.c | 12 +- lib/decompress/huf_decompress.c | 1 + 3 files changed, 102 insertions(+), 162 deletions(-) diff --git a/lib/common/bits.h b/lib/common/bits.h index 65fb456db..40d86a750 100644 --- a/lib/common/bits.h +++ b/lib/common/bits.h @@ -14,16 +14,19 @@ #include "mem.h" MEM_STATIC unsigned ZSTD_highbit32_fallback(U32 val) { - static const U32 DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, - 11, 14, 16, 18, 22, 25, 3, 30, - 8, 12, 20, 28, 15, 17, 24, 7, - 19, 27, 23, 6, 26, 5, 4, 31 }; - val |= val >> 1; - val |= val >> 2; - val |= val >> 4; - val |= val >> 8; - val |= val >> 16; - return DeBruijnClz[(val * 0x07C4ACDDU) >> 27]; + assert(val != 0); + { + static const U32 DeBruijnClz[32] = {0, 9, 1, 10, 13, 21, 2, 29, + 11, 14, 16, 18, 22, 25, 3, 30, + 8, 12, 20, 28, 15, 17, 24, 7, + 19, 27, 23, 6, 26, 5, 4, 31}; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + return DeBruijnClz[(val * 0x07C4ACDDU) >> 27]; + } } MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ @@ -34,16 +37,11 @@ MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCo # if STATIC_BMI2 == 1 return _lzcnt_u32(val)^31; # else - if (val != 0) { - unsigned long r; - _BitScanReverse(&r, val); - return (unsigned)r; - } else { - /* Should not reach this code path */ - __assume(0); - } + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)r; # endif -# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */ +# elif defined(__GNUC__) && (__GNUC__ >= 4) /* GCC Intrinsic */ return (unsigned)__builtin_clz (val) ^ 31; # elif defined(__ICCARM__) /* IAR Intrinsic */ return 31 - __CLZ(val); @@ -55,45 +53,54 @@ MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCo MEM_STATIC unsigned ZSTD_countTrailingZeros32_fallback(U32 val) { - static const int DeBruijnBytePos[32] = { 0, 1, 28, 2, 29, 14, 24, 3, - 30, 22, 20, 15, 25, 17, 4, 8, - 31, 27, 13, 23, 21, 19, 16, 7, - 26, 12, 18, 6, 11, 5, 10, 9 }; - return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; + assert(val != 0); + { + static const int DeBruijnBytePos[32] = {0, 1, 28, 2, 29, 14, 24, 3, + 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, + 26, 12, 18, 6, 11, 5, 10, 9}; + return DeBruijnBytePos[((U32) ((val & -(S32) val) * 0x077CB531U)) >> 27]; + } } MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) { assert(val != 0); # if defined(_MSC_VER) - if (val != 0) { - unsigned long r; - _BitScanForward(&r, val); - return (unsigned)r; - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) + unsigned long r; + _BitScanForward(&r, val); + return (unsigned)r; +# elif defined(__GNUC__) && (__GNUC__ >= 4) return (unsigned)__builtin_ctz(val); -# elif defined(__ICCARM__) /* IAR Intrinsic */ - return __CTZ(val); # else return ZSTD_countTrailingZeros32_fallback(val); # endif } -MEM_STATIC unsigned ZSTD_countTrailingZeros64_fallback(U64 val) +MEM_STATIC unsigned ZSTD_countLeadingZeros32_fallback(U32 val) { + assert(val != 0); + { + unsigned result = 0; + while ((val & 0x80000000) == 0) { + result++; + val <<= 1; + } + return result; + } +} + +MEM_STATIC unsigned ZSTD_countLeadingZeros32(U32 val) { - static const int DeBruijnBytePos[64] = { 0, 1, 2, 7, 3, 13, 8, 19, - 4, 25, 14, 28, 9, 34, 20, 56, - 5, 17, 26, 54, 15, 41, 29, 43, - 10, 31, 38, 35, 21, 45, 49, 57, - 63, 6, 12, 18, 24, 27, 33, 55, - 16, 53, 40, 42, 30, 37, 44, 48, - 62, 11, 23, 32, 52, 39, 36, 47, - 61, 22, 51, 46, 60, 50, 59, 58 }; - return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; + assert(val != 0); +# if defined(_MSC_VER) + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)r; +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)__builtin_clz(val); +# else + return ZSTD_countLeadingZeros32_fallback(val); +# endif } MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) @@ -103,142 +110,66 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) # if STATIC_BMI2 return _tzcnt_u64(val); # else - if (val != 0) { - unsigned long r; - _BitScanForward64(&r, val); - return (unsigned)r; - } else { - /* Should not reach this code path */ - __assume(0); - } + unsigned long r; + _BitScanForward64(&r, val); + return (unsigned)r; # endif -# elif defined(__GNUC__) && (__GNUC__ >= 4) - if (MEM_32bits()) { +# elif defined(__GNUC__) && (__GNUC__ >= 4) && defined(__LP64__) + return (unsigned)__builtin_ctzll(val); +# else + { U32 mostSignificantWord = (U32)(val >> 32); U32 leastSignificantWord = (U32)val; if (leastSignificantWord == 0) { - return 32 + (unsigned)__builtin_ctz(mostSignificantWord); + return 32 + ZSTD_countTrailingZeros32(mostSignificantWord); } else { - return (unsigned)__builtin_ctz(leastSignificantWord); + return ZSTD_countTrailingZeros32(leastSignificantWord); } - } else { - return (unsigned)__builtin_ctzll(val); } -# else - return ZSTD_countTrailingZeros64_fallback(val); # endif } -MEM_STATIC unsigned ZSTD_NbCommonBytes_fallback(size_t val) +MEM_STATIC unsigned ZSTD_countLeadingZeros64(U64 val) { - if (MEM_isLittleEndian()) { - if (MEM_64bits()) { - static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, - 0, 3, 1, 3, 1, 4, 2, 7, - 0, 2, 3, 6, 1, 5, 3, 5, - 1, 3, 4, 4, 2, 5, 6, 7, - 7, 0, 1, 2, 3, 3, 4, 6, - 2, 6, 5, 5, 3, 4, 5, 6, - 7, 1, 2, 4, 6, 4, 4, 5, - 7, 2, 6, 5, 7, 6, 7, 7 }; - return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; - } else { /* 32 bits */ - static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, - 3, 2, 2, 1, 3, 2, 0, 1, - 3, 3, 1, 2, 2, 2, 2, 0, - 3, 1, 2, 0, 1, 0, 1, 1 }; - return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; + assert(val != 0); +# if defined(_MSC_VER) && defined(_WIN64) +# if STATIC_BMI2 + return _lzcnt_u64(val); +# else + unsigned long r; + _BitScanReverse64(&r, val); + return (unsigned)r; +# endif +# elif defined(__GNUC__) && (__GNUC__ >= 4) + return (unsigned)(__builtin_clzll(val)); +# else + { + U32 mostSignificantWord = (U32)(val >> 32); + U32 leastSignificantWord = (U32)val; + if (mostSignificantWord == 0) { + return 32 + ZSTD_countLeadingZeros32(leastSignificantWord); + } else { + return ZSTD_countLeadingZeros32(mostSignificantWord); + } } - } else { /* Big Endian CPU */ - unsigned r; - if (MEM_64bits()) { - const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */ - if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; } - if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } - r += (!val); - return r; - } else { /* 32 bits */ - if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } - r += (!val); - return r; - } - } +# endif } MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) { if (MEM_isLittleEndian()) { if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) -# if STATIC_BMI2 - return _tzcnt_u64(val) >> 3; -# else - if (val != 0) { - unsigned long r; - _BitScanForward64(&r, (U64)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 4) - return (unsigned)(__builtin_ctzll((U64)val) >> 3); -# else - return ZSTD_NbCommonBytes_fallback(val); -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - if (val != 0) { - unsigned long r; - _BitScanForward(&r, (U32)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (unsigned)(__builtin_ctz((U32)val) >> 3); -# else - return ZSTD_NbCommonBytes_fallback(val); -# endif + return ZSTD_countTrailingZeros64((U64)val) >> 3; + } else { + return ZSTD_countTrailingZeros32((U32)val) >> 3; } } else { /* Big Endian CPU */ if (MEM_64bits()) { -# if defined(_MSC_VER) && defined(_WIN64) -# if STATIC_BMI2 - return _lzcnt_u64(val) >> 3; -# else - if (val != 0) { - unsigned long r; - _BitScanReverse64(&r, (U64)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 4) - return (unsigned)(__builtin_clzll(val) >> 3); -# else - return ZSTD_NbCommonBytes_fallback(val); -# endif - } else { /* 32 bits */ -# if defined(_MSC_VER) - if (val != 0) { - unsigned long r; - _BitScanReverse(&r, (unsigned long)val); - return (unsigned)(r >> 3); - } else { - /* Should not reach this code path */ - __assume(0); - } -# elif defined(__GNUC__) && (__GNUC__ >= 3) - return (unsigned)(__builtin_clz((U32)val) >> 3); -# else - return ZSTD_NbCommonBytes_fallback(val); -# endif - } } + return ZSTD_countLeadingZeros64((U64)val) >> 3; + } else { + return ZSTD_countLeadingZeros32((U32)val) >> 3; + } + } } #endif /* ZSTD_BITS_H */ diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index c619aea3a..278995491 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -766,6 +766,14 @@ size_t ZSTD_HcFindBestMatch( typedef U64 ZSTD_VecMask; /* Clarifies when we are interacting with a U64 representing a mask of matches */ +/* ZSTD_VecMask_next(): + * Starting from the LSB, returns the idx of the next non-zero bit. + * Basically counting the nb of trailing zeroes. + */ +MEM_STATIC U32 ZSTD_VecMask_next(ZSTD_VecMask val) { + return ZSTD_countTrailingZeros64(val); +} + /* ZSTD_rotateRight_*(): * Rotates a bitfield to the right by "count" bits. * https://en.wikipedia.org/w/index.php?title=Circular_shift&oldid=991635599#Implementing_circular_shifts @@ -1165,7 +1173,7 @@ size_t ZSTD_RowFindBestMatch( /* Cycle through the matches and prefetch */ for (; (matches > 0) && (nbAttempts > 0); --nbAttempts, matches &= (matches - 1)) { - U32 const matchPos = (head + ZSTD_countTrailingZeros64(matches)) & rowMask; + U32 const matchPos = (head + ZSTD_VecMask_next(matches)) & rowMask; U32 const matchIndex = row[matchPos]; assert(numMatches < rowEntries); if (matchIndex < lowLimit) @@ -1233,7 +1241,7 @@ size_t ZSTD_RowFindBestMatch( ZSTD_VecMask matches = ZSTD_row_getMatchMask(dmsTagRow, (BYTE)dmsTag, head, rowEntries); for (; (matches > 0) && (nbAttempts > 0); --nbAttempts, matches &= (matches - 1)) { - U32 const matchPos = (head + ZSTD_countTrailingZeros64(matches)) & rowMask; + U32 const matchPos = (head + ZSTD_VecMask_next(matches)) & rowMask; U32 const matchIndex = dmsRow[matchPos]; if (matchIndex < dmsLowestIndex) break; diff --git a/lib/decompress/huf_decompress.c b/lib/decompress/huf_decompress.c index 4541ca98c..c6fd92860 100644 --- a/lib/decompress/huf_decompress.c +++ b/lib/decompress/huf_decompress.c @@ -263,6 +263,7 @@ static size_t HUF_initRemainingDStream(BIT_DStream_t* bit, HUF_DecompressAsmArgs return ERROR(corruption_detected); /* Construct the BIT_DStream_t. */ + assert(sizeof(size_t) == 8); bit->bitContainer = MEM_readLE64(args->ip[stream]); bit->bitsConsumed = ZSTD_countTrailingZeros64(args->bits[stream]); bit->start = (const char*)args->iend[0]; From 6994a9f99c97f817e42f638840b65c53cad2479b Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Mon, 14 Feb 2022 16:08:00 -0500 Subject: [PATCH 093/472] bits.h refactor and bugfix --- lib/common/bits.h | 70 ++++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 47 deletions(-) diff --git a/lib/common/bits.h b/lib/common/bits.h index 40d86a750..07b4e4dca 100644 --- a/lib/common/bits.h +++ b/lib/common/bits.h @@ -13,44 +13,6 @@ #include "mem.h" -MEM_STATIC unsigned ZSTD_highbit32_fallback(U32 val) { - assert(val != 0); - { - static const U32 DeBruijnClz[32] = {0, 9, 1, 10, 13, 21, 2, 29, - 11, 14, 16, 18, 22, 25, 3, 30, - 8, 12, 20, 28, 15, 17, 24, 7, - 19, 27, 23, 6, 26, 5, 4, 31}; - val |= val >> 1; - val |= val >> 2; - val |= val >> 4; - val |= val >> 8; - val |= val >> 16; - return DeBruijnClz[(val * 0x07C4ACDDU) >> 27]; - } -} - -MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ -{ - assert(val != 0); - { -# if defined(_MSC_VER) /* Visual */ -# if STATIC_BMI2 == 1 - return _lzcnt_u32(val)^31; -# else - unsigned long r; - _BitScanReverse(&r, val); - return (unsigned)r; -# endif -# elif defined(__GNUC__) && (__GNUC__ >= 4) /* GCC Intrinsic */ - return (unsigned)__builtin_clz (val) ^ 31; -# elif defined(__ICCARM__) /* IAR Intrinsic */ - return 31 - __CLZ(val); -# else /* Software version */ - return ZSTD_highbit32_fallback(val); -# endif - } -} - MEM_STATIC unsigned ZSTD_countTrailingZeros32_fallback(U32 val) { assert(val != 0); @@ -67,9 +29,13 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) { assert(val != 0); # if defined(_MSC_VER) - unsigned long r; - _BitScanForward(&r, val); - return (unsigned)r; +# if STATIC_BMI2 == 1 + return _tzcnt_u32(val); +# else + unsigned long r; + _BitScanForward(&r, val); + return (unsigned)r; +# endif # elif defined(__GNUC__) && (__GNUC__ >= 4) return (unsigned)__builtin_ctz(val); # else @@ -93,9 +59,13 @@ MEM_STATIC unsigned ZSTD_countLeadingZeros32(U32 val) { assert(val != 0); # if defined(_MSC_VER) - unsigned long r; - _BitScanReverse(&r, val); - return (unsigned)r; +# if STATIC_BMI2 == 1 + return _lzcnt_u32(val); +# else + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)(r ^ 31); +# endif # elif defined(__GNUC__) && (__GNUC__ >= 4) return (unsigned)__builtin_clz(val); # else @@ -107,7 +77,7 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) { assert(val != 0); # if defined(_MSC_VER) && defined(_WIN64) -# if STATIC_BMI2 +# if STATIC_BMI2 == 1 return _tzcnt_u64(val); # else unsigned long r; @@ -133,12 +103,12 @@ MEM_STATIC unsigned ZSTD_countLeadingZeros64(U64 val) { assert(val != 0); # if defined(_MSC_VER) && defined(_WIN64) -# if STATIC_BMI2 +# if STATIC_BMI2 == 1 return _lzcnt_u64(val); # else unsigned long r; _BitScanReverse64(&r, val); - return (unsigned)r; + return (unsigned)(r ^ 63); # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) return (unsigned)(__builtin_clzll(val)); @@ -172,4 +142,10 @@ MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) } } +MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ +{ + assert(val != 0); + return ZSTD_countLeadingZeros32(val) ^ 31; +} + #endif /* ZSTD_BITS_H */ From 7c674a09199f1c47b88116e67f0d749ce8373a1f Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Mon, 14 Feb 2022 17:15:30 -0500 Subject: [PATCH 094/472] Add tests for bitwise intrinsics --- tests/fuzzer.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 2060a1d31..9b31469e3 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -3375,6 +3375,62 @@ static int basicUnitTests(U32 const seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : testing bitwise instrinsics PR#3045: ", testNb++); + { + U32 seed_32 = seed == 0 ? seed + 1 : seed; // these intrinsics are undefined on 0 + U64 seed_64 = (U64)seed * 0x87654321; // decent 64-bit distribution + U32 lowbit_only_32 = 1; + U64 lowbit_only_64 = 1; + U32 highbit_only_32 = (U32)1 << 31; + U64 highbit_only_64 = (U64)1 << 63; + + /* Test ZSTD_countTrailingZeros32 */ + CHECK_EQ(ZSTD_countTrailingZeros32(lowbit_only_32), 0u); + CHECK_EQ(ZSTD_countTrailingZeros32(highbit_only_32), 31u); + CHECK_EQ(ZSTD_countTrailingZeros32(seed_32), ZSTD_countTrailingZeros32_fallback(seed_32)); + + /* Test ZSTD_countLeadingZeros32 */ + CHECK_EQ(ZSTD_countLeadingZeros32(lowbit_only_32), 31u); + CHECK_EQ(ZSTD_countLeadingZeros32(highbit_only_32), 0u); + CHECK_EQ(ZSTD_countLeadingZeros32(seed_32), ZSTD_countLeadingZeros32_fallback(seed_32)); + + /* Test ZSTD_countTrailingZeros64 */ + CHECK_EQ(ZSTD_countTrailingZeros64(lowbit_only_64), 0u); + CHECK_EQ(ZSTD_countTrailingZeros64(highbit_only_64), 63u); + + /* Test ZSTD_countLeadingZeros64 */ + CHECK_EQ(ZSTD_countLeadingZeros64(lowbit_only_64), 63u); + CHECK_EQ(ZSTD_countLeadingZeros64(highbit_only_64), 0u); + + /* Test ZSTD_highbit32 */ + CHECK_EQ(ZSTD_highbit32(lowbit_only_32), 0u); + CHECK_EQ(ZSTD_highbit32(highbit_only_32), 31u); + + /* Test ZSTD_NbCommonBytes */ + if (MEM_isLittleEndian()) { + if (MEM_64bits()) { + CHECK_EQ(ZSTD_NbCommonBytes(lowbit_only_32), 0u); + CHECK_EQ(ZSTD_NbCommonBytes(highbit_only_32), 3u); + } else { + CHECK_EQ(ZSTD_NbCommonBytes(lowbit_only_32), 0u); + CHECK_EQ(ZSTD_NbCommonBytes(highbit_only_32), 3u); + } + } else { + if (MEM_64bits()) { + CHECK_EQ(ZSTD_NbCommonBytes(lowbit_only_32), 7u); + CHECK_EQ(ZSTD_NbCommonBytes(highbit_only_32), 4u); + } else { + CHECK_EQ(ZSTD_NbCommonBytes(lowbit_only_32), 3u); + CHECK_EQ(ZSTD_NbCommonBytes(highbit_only_32), 0u); + } + } + + /* Test MEM_ intrinsics */ + CHECK_EQ(MEM_swap32(seed_32), MEM_swap32_fallback(seed_32)); + CHECK_EQ(MEM_swap64(seed_64), MEM_swap64_fallback(seed_64)); + } + DISPLAYLEVEL(3, "OK \n"); + #ifdef ZSTD_MULTITHREAD DISPLAYLEVEL(3, "test%3i : passing wrong full dict should fail on compressStream2 refPrefix ", testNb++); { ZSTD_CCtx* cctx = ZSTD_createCCtx(); From 00f2acba36bfe882e8e64a0115d6da31922bab91 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 15 Feb 2022 11:41:09 -0500 Subject: [PATCH 095/472] Add back check to prevent Win32 static analysis issues --- lib/common/bits.h | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/lib/common/bits.h b/lib/common/bits.h index 07b4e4dca..191e68a78 100644 --- a/lib/common/bits.h +++ b/lib/common/bits.h @@ -32,9 +32,14 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) # if STATIC_BMI2 == 1 return _tzcnt_u32(val); # else - unsigned long r; - _BitScanForward(&r, val); - return (unsigned)r; + if (val != 0) { + unsigned long r; + _BitScanForward(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) return (unsigned)__builtin_ctz(val); @@ -62,9 +67,14 @@ MEM_STATIC unsigned ZSTD_countLeadingZeros32(U32 val) # if STATIC_BMI2 == 1 return _lzcnt_u32(val); # else - unsigned long r; - _BitScanReverse(&r, val); - return (unsigned)(r ^ 31); + if (val != 0) { + unsigned long r; + _BitScanReverse(&r, val); + return (unsigned)(r ^ 31); + } else { + /* Should not reach this code path */ + __assume(0); + } # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) return (unsigned)__builtin_clz(val); @@ -80,9 +90,14 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros64(U64 val) # if STATIC_BMI2 == 1 return _tzcnt_u64(val); # else - unsigned long r; - _BitScanForward64(&r, val); - return (unsigned)r; + if (val != 0) { + unsigned long r; + _BitScanForward64(&r, val); + return (unsigned)r; + } else { + /* Should not reach this code path */ + __assume(0); + } # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) && defined(__LP64__) return (unsigned)__builtin_ctzll(val); @@ -106,9 +121,14 @@ MEM_STATIC unsigned ZSTD_countLeadingZeros64(U64 val) # if STATIC_BMI2 == 1 return _lzcnt_u64(val); # else - unsigned long r; - _BitScanReverse64(&r, val); - return (unsigned)(r ^ 63); + if (val != 0) { + unsigned long r; + _BitScanReverse64(&r, val); + return (unsigned)(r ^ 63); + } else { + /* Should not reach this code path */ + __assume(0); + } # endif # elif defined(__GNUC__) && (__GNUC__ >= 4) return (unsigned)(__builtin_clzll(val)); From 856c7dc51dcccc0c6f31a48e42a7a29475351828 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 16 Feb 2022 11:16:55 -0500 Subject: [PATCH 096/472] Fix fuzzer.c nits and replace CLZ fallback --- lib/common/bits.h | 16 ++++++++++------ tests/fuzzer.c | 24 ++++++++++++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/common/bits.h b/lib/common/bits.h index 191e68a78..2c4ade865 100644 --- a/lib/common/bits.h +++ b/lib/common/bits.h @@ -51,12 +51,16 @@ MEM_STATIC unsigned ZSTD_countTrailingZeros32(U32 val) MEM_STATIC unsigned ZSTD_countLeadingZeros32_fallback(U32 val) { assert(val != 0); { - unsigned result = 0; - while ((val & 0x80000000) == 0) { - result++; - val <<= 1; - } - return result; + static const U32 DeBruijnClz[32] = {0, 9, 1, 10, 13, 21, 2, 29, + 11, 14, 16, 18, 22, 25, 3, 30, + 8, 12, 20, 28, 15, 17, 24, 7, + 19, 27, 23, 6, 26, 5, 4, 31}; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + return DeBruijnClz[(val * 0x07C4ACDDU) >> 27] ^ 31; } } diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 9b31469e3..047afc1c8 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -3377,22 +3377,26 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : testing bitwise instrinsics PR#3045: ", testNb++); { - U32 seed_32 = seed == 0 ? seed + 1 : seed; // these intrinsics are undefined on 0 - U64 seed_64 = (U64)seed * 0x87654321; // decent 64-bit distribution + U32 seed_copy = seed; // need non-const seed to avoid compiler warning for FUZ_rand(&seed) + U32 rand32 = FUZ_rand(&seed_copy); + U64 rand64 = ((U64)FUZ_rand(&seed_copy) << 32) | FUZ_rand(&seed_copy); U32 lowbit_only_32 = 1; U64 lowbit_only_64 = 1; U32 highbit_only_32 = (U32)1 << 31; U64 highbit_only_64 = (U64)1 << 63; + U32 i; + if (rand32 == 0) rand32 = 1; // CLZ and CTZ are undefined on 0 + if (rand64 == 0) rand64 = 1; // CLZ and CTZ are undefined on 0 /* Test ZSTD_countTrailingZeros32 */ CHECK_EQ(ZSTD_countTrailingZeros32(lowbit_only_32), 0u); CHECK_EQ(ZSTD_countTrailingZeros32(highbit_only_32), 31u); - CHECK_EQ(ZSTD_countTrailingZeros32(seed_32), ZSTD_countTrailingZeros32_fallback(seed_32)); + CHECK_EQ(ZSTD_countTrailingZeros32(rand32), ZSTD_countTrailingZeros32_fallback(rand32)); /* Test ZSTD_countLeadingZeros32 */ CHECK_EQ(ZSTD_countLeadingZeros32(lowbit_only_32), 31u); CHECK_EQ(ZSTD_countLeadingZeros32(highbit_only_32), 0u); - CHECK_EQ(ZSTD_countLeadingZeros32(seed_32), ZSTD_countLeadingZeros32_fallback(seed_32)); + CHECK_EQ(ZSTD_countLeadingZeros32(rand32), ZSTD_countLeadingZeros32_fallback(rand32)); /* Test ZSTD_countTrailingZeros64 */ CHECK_EQ(ZSTD_countTrailingZeros64(lowbit_only_64), 0u); @@ -3426,8 +3430,16 @@ static int basicUnitTests(U32 const seed, double compressibility) } /* Test MEM_ intrinsics */ - CHECK_EQ(MEM_swap32(seed_32), MEM_swap32_fallback(seed_32)); - CHECK_EQ(MEM_swap64(seed_64), MEM_swap64_fallback(seed_64)); + CHECK_EQ(MEM_swap32(rand32), MEM_swap32_fallback(rand32)); + CHECK_EQ(MEM_swap64(rand64), MEM_swap64_fallback(rand64)); + + /* Test fallbacks vs intrinsics on a range of small integers */ + for (i=1; i <= 1000; i++) { + CHECK_EQ(MEM_swap32(i), MEM_swap32_fallback(i)); + CHECK_EQ(MEM_swap64((U64)i), MEM_swap64_fallback((U64)i)); + CHECK_EQ(ZSTD_countTrailingZeros32(i), ZSTD_countTrailingZeros32_fallback(i)); + CHECK_EQ(ZSTD_countLeadingZeros32(i), ZSTD_countLeadingZeros32_fallback(i)); + } } DISPLAYLEVEL(3, "OK \n"); From 71d9dab76f6c496a39356f4d5e984525f2050373 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 16 Feb 2022 16:49:42 -0500 Subject: [PATCH 097/472] Replace XOR with subtraction for readability --- lib/common/bits.h | 8 ++++---- tests/fuzzer.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/common/bits.h b/lib/common/bits.h index 2c4ade865..c0e917750 100644 --- a/lib/common/bits.h +++ b/lib/common/bits.h @@ -60,7 +60,7 @@ MEM_STATIC unsigned ZSTD_countLeadingZeros32_fallback(U32 val) { val |= val >> 4; val |= val >> 8; val |= val >> 16; - return DeBruijnClz[(val * 0x07C4ACDDU) >> 27] ^ 31; + return 31 - DeBruijnClz[(val * 0x07C4ACDDU) >> 27]; } } @@ -74,7 +74,7 @@ MEM_STATIC unsigned ZSTD_countLeadingZeros32(U32 val) if (val != 0) { unsigned long r; _BitScanReverse(&r, val); - return (unsigned)(r ^ 31); + return (unsigned)(31 - r); } else { /* Should not reach this code path */ __assume(0); @@ -128,7 +128,7 @@ MEM_STATIC unsigned ZSTD_countLeadingZeros64(U64 val) if (val != 0) { unsigned long r; _BitScanReverse64(&r, val); - return (unsigned)(r ^ 63); + return (unsigned)(63 - r); } else { /* Should not reach this code path */ __assume(0); @@ -169,7 +169,7 @@ MEM_STATIC unsigned ZSTD_NbCommonBytes(size_t val) MEM_STATIC unsigned ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */ { assert(val != 0); - return ZSTD_countLeadingZeros32(val) ^ 31; + return 31 - ZSTD_countLeadingZeros32(val); } #endif /* ZSTD_BITS_H */ diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 047afc1c8..018da622c 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -3375,7 +3375,7 @@ static int basicUnitTests(U32 const seed, double compressibility) } DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : testing bitwise instrinsics PR#3045: ", testNb++); + DISPLAYLEVEL(3, "test%3i : testing bitwise intrinsics PR#3045: ", testNb++); { U32 seed_copy = seed; // need non-const seed to avoid compiler warning for FUZ_rand(&seed) U32 rand32 = FUZ_rand(&seed_copy); From 0178c12dd98ad5e63968b12eaaf32e3162a0ffee Mon Sep 17 00:00:00 2001 From: Ilya Tokar Date: Wed, 23 Feb 2022 17:59:56 -0500 Subject: [PATCH 098/472] Use helper function for bit manipulations. We already have BIT_getLowerBits, so use it. Benefits are 2fold: 1) Somewhat cleaner code 2) We are now using bzhi instructions, when available. Performance delta is too small for microbenchmarks, but avoiding load still helps larger applications, by reducing data cache pressure. --- lib/common/bitstream.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/common/bitstream.h b/lib/common/bitstream.h index 103b37832..43a221678 100644 --- a/lib/common/bitstream.h +++ b/lib/common/bitstream.h @@ -162,6 +162,16 @@ MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, return 0; } +MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) +{ +#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 + return _bzhi_u64(bitContainer, nbBits); +#else + assert(nbBits < BIT_MASK_SIZE); + return bitContainer & BIT_mask[nbBits]; +#endif +} + /*! BIT_addBits() : * can add up to 31 bits into `bitC`. * Note : does not check for register overflow ! */ @@ -171,7 +181,7 @@ MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, DEBUG_STATIC_ASSERT(BIT_MASK_SIZE == 32); assert(nbBits < BIT_MASK_SIZE); assert(nbBits + bitC->bitPos < sizeof(bitC->bitContainer) * 8); - bitC->bitContainer |= (value & BIT_mask[nbBits]) << bitC->bitPos; + bitC->bitContainer |= BIT_getLowerBits(value, nbBits) << bitC->bitPos; bitC->bitPos += nbBits; } @@ -309,16 +319,6 @@ MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 c #endif } -MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) -{ -#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 - return _bzhi_u64(bitContainer, nbBits); -#else - assert(nbBits < BIT_MASK_SIZE); - return bitContainer & BIT_mask[nbBits]; -#endif -} - /*! BIT_lookBits() : * Provides next n bits from local register. * local register is not modified. From 03bba1b0bfe3d877be354d9ba6b29532a1751e9e Mon Sep 17 00:00:00 2001 From: Dmytro Milinevskyi Date: Tue, 1 Mar 2022 18:29:47 +0100 Subject: [PATCH 099/472] build:cmake: enable ZSTD legacy support by default --- build/cmake/CMakeLists.txt | 2 +- build/cmake/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/cmake/CMakeLists.txt b/build/cmake/CMakeLists.txt index fdf7c8637..5e2cf3d56 100644 --- a/build/cmake/CMakeLists.txt +++ b/build/cmake/CMakeLists.txt @@ -82,7 +82,7 @@ message(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}") #----------------------------------------------------------------------------- # Legacy support -option(ZSTD_LEGACY_SUPPORT "LEGACY SUPPORT" OFF) +option(ZSTD_LEGACY_SUPPORT "LEGACY SUPPORT" ON) if (ZSTD_LEGACY_SUPPORT) message(STATUS "ZSTD_LEGACY_SUPPORT defined!") diff --git a/build/cmake/README.md b/build/cmake/README.md index 73b30dc77..f6854f4c0 100644 --- a/build/cmake/README.md +++ b/build/cmake/README.md @@ -37,7 +37,7 @@ cmake -LH .. Bool options can be set to `ON/OFF` with `-D[option]=[ON/OFF]`. You can configure cmake options like this: ```sh cd build/cmake/builddir -cmake -DZSTD_BUILD_TESTS=ON -DZSTD_LEGACY_SUPPORT=ON .. +cmake -DZSTD_BUILD_TESTS=ON -DZSTD_LEGACY_SUPPORT=OFF .. make ``` From da737c7ab89f61f1ea7c392299137f6ffe6f9733 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Wed, 2 Mar 2022 11:04:04 -0800 Subject: [PATCH 100/472] [programs] Fix infinite loop when empty input is passed to trainer When an empty input file was passed to the dictionary trainer, it would infinite loop. The added test case exposes the bug, and is fixed with this PR. --- programs/dibio.c | 5 ++++- tests/cli-tests/dict-builder/empty-input.sh | 9 +++++++++ tests/cli-tests/dict-builder/empty-input.sh.stderr.exact | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100755 tests/cli-tests/dict-builder/empty-input.sh create mode 100644 tests/cli-tests/dict-builder/empty-input.sh.stderr.exact diff --git a/programs/dibio.c b/programs/dibio.c index fddbc9e57..f6757dd34 100644 --- a/programs/dibio.c +++ b/programs/dibio.c @@ -128,8 +128,11 @@ static int DiB_loadFiles( while ( nbSamplesLoaded < sstSize && fileIndex < nbFiles ) { size_t fileDataLoaded; S64 const fileSize = DiB_getFileSize(fileNamesTable[fileIndex]); - if (fileSize <= 0) /* skip if zero-size or file error */ + if (fileSize <= 0) { + /* skip if zero-size or file error */ + ++fileIndex; continue; + } f = fopen( fileNamesTable[fileIndex], "rb"); if (f == NULL) diff --git a/tests/cli-tests/dict-builder/empty-input.sh b/tests/cli-tests/dict-builder/empty-input.sh new file mode 100755 index 000000000..b500bfebd --- /dev/null +++ b/tests/cli-tests/dict-builder/empty-input.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -e +for i in $(seq 50); do + datagen -s$i > file$i +done +touch empty + +set -v +zstd -q --train empty file* diff --git a/tests/cli-tests/dict-builder/empty-input.sh.stderr.exact b/tests/cli-tests/dict-builder/empty-input.sh.stderr.exact new file mode 100644 index 000000000..2747e766c --- /dev/null +++ b/tests/cli-tests/dict-builder/empty-input.sh.stderr.exact @@ -0,0 +1 @@ +zstd -q --train empty file* From 0c386afbfd07b3f914a00ab5a2a0cbf3f7af0d66 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 3 Mar 2022 14:52:06 -0500 Subject: [PATCH 101/472] Fix CI failures by adding apt-get update to Github Actions (#3082) * Fix CI failures by adding apt-get update to Makefile * Fix travis failure caused by apt-get update * Move apt-get update from Makefile to Github Actions .yml * Revert .travis.yml change * Fix typo --- .github/workflows/dev-long-tests.yml | 4 ++++ Makefile | 2 ++ 2 files changed, 6 insertions(+) diff --git a/.github/workflows/dev-long-tests.yml b/.github/workflows/dev-long-tests.yml index 60d1d45b9..779ba1c7c 100644 --- a/.github/workflows/dev-long-tests.yml +++ b/.github/workflows/dev-long-tests.yml @@ -75,6 +75,7 @@ jobs: - uses: actions/checkout@v2 - name: ASan + UBSan + Test Zstd, 32bit mode run: | + sudo apt-get -qqq update make libc6install make -j uasan-test-zstd32 V=1 @@ -88,6 +89,7 @@ jobs: - uses: actions/checkout@v2 - name: gcc-8 + ASan + UBSan + Fuzz Test run: | + sudo apt-get -qqq update make gcc8install CC=gcc-8 FUZZER_FLAGS="--long-tests" make clean uasan-fuzztest @@ -97,6 +99,7 @@ jobs: - uses: actions/checkout@v2 - name: ASan + UBSan + Fuzz Test 32bit run: | + sudo apt-get -qqq update make libc6install CFLAGS="-O3 -m32" FUZZER_FLAGS="--long-tests" make uasan-fuzztest @@ -152,6 +155,7 @@ jobs: - name: valgrind + fuzz test stack mode # ~ 7mn shell: 'script -q -e -c "bash {0}"' run: | + sudo apt-get -qqq update make valgrindinstall make -C tests valgrindTest make clean diff --git a/Makefile b/Makefile index 9b5451d3d..67ef928cc 100644 --- a/Makefile +++ b/Makefile @@ -334,6 +334,8 @@ tsan-%: clean .PHONY: apt-install apt-install: + # TODO: uncomment once issue 3011 is resolved and remove hack from Github Actions .yml + # sudo apt-get update sudo apt-get -yq --no-install-suggests --no-install-recommends --force-yes install $(APT_PACKAGES) .PHONY: apt-add-repo From 7c3d1cb3ab9b43745c65bb1796960dbbaa237a02 Mon Sep 17 00:00:00 2001 From: Ilya Tokar Date: Tue, 1 Mar 2022 18:49:10 -0500 Subject: [PATCH 102/472] Enable STATIC_BMI2 for gcc/clang Some usage (e.g. BIT_getLowerBit) uses it without checking for MSVC, so enabling for clang gives a small performance boost. --- lib/common/bitstream.h | 8 ++++---- lib/common/compiler.h | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/common/bitstream.h b/lib/common/bitstream.h index 43a221678..731630ea4 100644 --- a/lib/common/bitstream.h +++ b/lib/common/bitstream.h @@ -37,8 +37,8 @@ extern "C" { * Target specific =========================================*/ #ifndef ZSTD_NO_INTRINSICS -# if defined(__BMI__) && defined(__GNUC__) -# include /* support for bextr (experimental) */ +# if (defined(__BMI__) || defined(__BMI2__)) && defined(__GNUC__) +# include /* support for bextr (experimental)/bzhi */ # elif defined(__ICCARM__) # include # endif @@ -164,8 +164,8 @@ MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits) { -#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 - return _bzhi_u64(bitContainer, nbBits); +#if defined(STATIC_BMI2) && STATIC_BMI2 == 1 && !defined(ZSTD_NO_INTRINSICS) + return _bzhi_u64(bitContainer, nbBits); #else assert(nbBits < BIT_MASK_SIZE); return bitContainer & BIT_mask[nbBits]; diff --git a/lib/common/compiler.h b/lib/common/compiler.h index 516930c01..6c7100e83 100644 --- a/lib/common/compiler.h +++ b/lib/common/compiler.h @@ -181,6 +181,8 @@ # ifdef __AVX2__ //MSVC does not have a BMI2 specific flag, but every CPU that supports AVX2 also supports BMI2 # define STATIC_BMI2 1 # endif +# elif defined(__BMI2__) && defined(__x86_64__) && defined(__GNUC__) +# define STATIC_BMI2 1 # endif #endif From d109cef2012b1e0ca7a6f47278a2838f68bbc196 Mon Sep 17 00:00:00 2001 From: Xi Ruoyao Date: Sat, 5 Mar 2022 03:56:44 +0800 Subject: [PATCH 103/472] fix the assertion in readLinesFromFile (#3084) * fix the assertion in readLinesFromFile When the file is not terminated by endline, readLineFromFile will append a '\0' for the last line. In this case pos + lineLength == dstCapacity. * test: don't print very long text garbage --- programs/util.c | 2 +- tests/playTests.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/programs/util.c b/programs/util.c index d69b72a37..55bcff25a 100644 --- a/programs/util.c +++ b/programs/util.c @@ -418,7 +418,7 @@ readLinesFromFile(void* dst, size_t dstCapacity, while ( !feof(inputFile) ) { size_t const lineLength = readLineFromFile(buf+pos, dstCapacity-pos, inputFile); if (lineLength == 0) break; - assert(pos + lineLength < dstCapacity); + assert(pos + lineLength <= dstCapacity); /* '=' for inputFile not terminated with '\n' */ pos += lineLength; ++nbFiles; } diff --git a/tests/playTests.sh b/tests/playTests.sh index 71e8dc058..d4271b2f0 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -735,11 +735,11 @@ test -f tmp4 println "test : survive the list of files with too long filenames (--filelist=FILE)" datagen -g5M > tmp_badList -zstd -f --filelist=tmp_badList && die "should have failed : file name length is too long" +zstd -qq -f --filelist=tmp_badList && die "should have failed : file name length is too long" # printing very long text garbage on console will cause CI failure println "test : survive a list of files which is text garbage (--filelist=FILE)" datagen > tmp_badList -zstd -f --filelist=tmp_badList && die "should have failed : list is text garbage" +zstd -qq -f --filelist=tmp_badList && die "should have failed : list is text garbage" # printing very long text garbage on console will cause CI failure println "test : survive a list of files which is binary garbage (--filelist=FILE)" datagen -P0 -g1M > tmp_badList From cf1894b3243f5510c34b871f6d6e6b8321de01f8 Mon Sep 17 00:00:00 2001 From: Dimitris Apostolou Date: Wed, 9 Feb 2022 08:58:23 +0200 Subject: [PATCH 104/472] Fix typos --- build/meson/lib/meson.build | 2 +- build/single_file_libs/combine.py | 4 ++-- lib/common/portability_macros.h | 4 ++-- tests/playTests.sh | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/meson/lib/meson.build b/build/meson/lib/meson.build index 6b0933781..cb7dc6957 100644 --- a/build/meson/lib/meson.build +++ b/build/meson/lib/meson.build @@ -47,7 +47,7 @@ libzstd_sources = [join_paths(zstd_rootdir, 'lib/common/entropy_common.c'), # really we need anything that defines __GNUC__ as that is what ZSTD_ASM_SUPPORTED is gated on # but these are the two compilers that are supported in tree and actually handle this correctly -# Otherwise, explicitly disable assmebly. +# Otherwise, explicitly disable assembly. if [compiler_gcc, compiler_clang].contains(cc_id) libzstd_sources += join_paths(zstd_rootdir, 'lib/decompress/huf_decompress_amd64.S') else diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index badd68a91..3d91dc3ee 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -41,7 +41,7 @@ destn: TextIO = sys.stdout # Set of file Path objects previously inlined (and to ignore if reencountering). found: Set[Path] = set() -# Compiled regex Patern to handle "#pragma once" in various formats: +# Compiled regex Pattern to handle "#pragma once" in various formats: # # #pragma once # #pragma once @@ -53,7 +53,7 @@ found: Set[Path] = set() # pragma_regex: Pattern = re.compile(r'^\s*#\s*pragma\s*once\s*') -# Compiled regex Patern to handle the following type of file includes: +# Compiled regex Pattern to handle the following type of file includes: # # #include "file" # #include "file" diff --git a/lib/common/portability_macros.h b/lib/common/portability_macros.h index 23a650885..1650fa3d8 100644 --- a/lib/common/portability_macros.h +++ b/lib/common/portability_macros.h @@ -12,7 +12,7 @@ #define ZSTD_PORTABILITY_MACROS_H /** - * This header file contains macro defintions to support portability. + * This header file contains macro definitions to support portability. * This header is shared between C and ASM code, so it MUST only * contain macro definitions. It MUST not contain any C code. * @@ -88,7 +88,7 @@ #endif /** - * Only enable assembly for GNUC comptabile compilers, + * Only enable assembly for GNUC compatible compilers, * because other platforms may not support GAS assembly syntax. * * Only enable assembly for Linux / MacOS, other platforms may diff --git a/tests/playTests.sh b/tests/playTests.sh index d4271b2f0..873c3c672 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -225,7 +225,7 @@ ZSTD_CLEVEL=50000000000 zstd -f tmp # numeric value too large, warn and revert t println "test : override ZSTD_CLEVEL with command line option" ZSTD_CLEVEL=12 zstd --fast=3 -f tmp # overridden by command line option -# temporary envvar chnages in the above tests would actually persist in macos /bin/sh +# temporary envvar changes in the above tests would actually persist in macos /bin/sh unset ZSTD_CLEVEL @@ -1448,7 +1448,7 @@ then ZSTD_NBTHREADS=50000000000 zstd -f mt_tmp # numeric value too large, warn and revert to default setting= ZSTD_NBTHREADS=2 zstd -f mt_tmp # correct usage ZSTD_NBTHREADS=1 zstd -f mt_tmp # correct usage: single thread - # temporary envvar chnages in the above tests would actually persist in macos /bin/sh + # temporary envvar changes in the above tests would actually persist in macos /bin/sh unset ZSTD_NBTHREADS rm -f mt_tmp* From e470c940f6cb6cfff4b27d595ec651a3c1c2cc15 Mon Sep 17 00:00:00 2001 From: Cyber Knight Date: Mon, 7 Mar 2022 11:55:33 +0800 Subject: [PATCH 105/472] [contrib][linux] Fix a warning in zstd_reset_cstream() - This fixes the below warning: ../lib/zstd/zstd_compress_module.c: In function 'zstd_reset_cstream': ../lib/zstd/zstd_compress_module.c:136:9: warning: 'ZSTD_resetCStream' is deprecated [-Wdeprecated-declarations] 136 | return ZSTD_resetCStream(cstream, pledged_src_size); | ^~~~~~ In file included from ../include/linux/zstd.h:26, from ../lib/zstd/zstd_compress_module.c:15: ../include/linux/zstd_lib.h:2277:8: note: declared here 2277 | size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); | ^~~~~~~~~~~~~~~~~ ZSTD_resetCstream is deprecated and zstd_CCtx_reset is suggested to use hence let's switch to it. Signed-off-by: Cyber Knight --- contrib/linux-kernel/zstd_compress_module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/linux-kernel/zstd_compress_module.c b/contrib/linux-kernel/zstd_compress_module.c index 65548a4bb..7b25be6e3 100644 --- a/contrib/linux-kernel/zstd_compress_module.c +++ b/contrib/linux-kernel/zstd_compress_module.c @@ -133,7 +133,7 @@ EXPORT_SYMBOL(zstd_init_cstream); size_t zstd_reset_cstream(zstd_cstream *cstream, unsigned long long pledged_src_size) { - return ZSTD_resetCStream(cstream, pledged_src_size); + return ZSTD_CCtx_reset(cstream, pledged_src_size); } EXPORT_SYMBOL(zstd_reset_cstream); From 8ff20c25f38f62cd1e898cf81173e280f42327f5 Mon Sep 17 00:00:00 2001 From: Cyber Knight Date: Tue, 8 Mar 2022 13:38:06 +0800 Subject: [PATCH 106/472] [contrib][linux] Use ZSTD_CCtx_setPledgedSrcSize() instead of ZSTD_CCtx_reset() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - The previous patch throws the following warning: ../linux/lib/zstd/zstd_compress_module.c: In function ‘zstd_reset_cstream’: ../linux/lib/zstd/zstd_compress_module.c:136:34: error: enum conversion when passing argument 2 of ‘ZSTD_CCtx_reset’ is invalid in C++ [-Werror=c++-compat] 136 | return ZSTD_CCtx_reset(cstream, pledged_src_size); | ^~~~~~~~~~~~~~~~ In file included from ../linux/include/linux/zstd.h:26, from ../linux/lib/zstd/zstd_compress_module.c:15: ../linux/include/linux/zstd_lib.h:501:20: note: expected ‘ZSTD_ResetDirective’ {aka ‘enum ’} but argument is of type ‘long long unsigned int’ 501 | ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset); | ^~~~~~~~~~~~~~~ cc1: all warnings being treated as errors Since we have a choice to either use ZSTD_CCtx_reset or ZSTD_CCtx_setPledgedSrcSize instead of ZSTD_resetCStream, let's switch to ZSTD_CCtx_setPledgedSrcSize to not have any unnecessary warns alongside the kernel build and CI test build. Signed-off-by: Cyber Knight --- contrib/linux-kernel/zstd_compress_module.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/linux-kernel/zstd_compress_module.c b/contrib/linux-kernel/zstd_compress_module.c index 7b25be6e3..8b4c764d4 100644 --- a/contrib/linux-kernel/zstd_compress_module.c +++ b/contrib/linux-kernel/zstd_compress_module.c @@ -131,9 +131,9 @@ zstd_cstream *zstd_init_cstream(const zstd_parameters *parameters, EXPORT_SYMBOL(zstd_init_cstream); size_t zstd_reset_cstream(zstd_cstream *cstream, - unsigned long long pledged_src_size) + unsigned long long pledgedSrcSize) { - return ZSTD_CCtx_reset(cstream, pledged_src_size); + return ZSTD_CCtx_setPledgedSrcSize(cstream, pledgedSrcSize); } EXPORT_SYMBOL(zstd_reset_cstream); From 3f4f8b04ed2d318536c9f54e0c575603ed75d92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dirk=20M=C3=BCller?= Date: Mon, 7 Feb 2022 20:39:15 +0100 Subject: [PATCH 107/472] Keep original file if -c or --stdout is given Set removeSrcFile back to false when -c or --stdout is used to improve compatibility with gzip(1) behavior. gzip(1) is removing the original file on compression unless --stdout or /-c is used. zstd is defaulting to keep the file unless --rm is used or when it is called via a gzip symlink, in which it is removing by default. Specifying -c/--stdout turns this behavior off. --- programs/zstd.1 | 4 ++-- programs/zstd.1.md | 2 +- programs/zstdcli.c | 10 +++++----- tests/cli-tests/compression/basic.sh | 4 ++++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/programs/zstd.1 b/programs/zstd.1 index 0e6e016e9..346b08b18 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -1,5 +1,5 @@ . -.TH "ZSTD" "1" "January 2022" "zstd 1.5.2" "User Commands" +.TH "ZSTD" "1" "February 2022" "zstd 1.5.2" "User Commands" . .SH "NAME" \fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files @@ -165,7 +165,7 @@ Additionally, this can be used to limit memory for dictionary training\. This pa \fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\. . .IP "\(bu" 4 -\fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console) +\fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console); keep original files unchanged\. . .IP "\(bu" 4 \fB\-\-[no\-]sparse\fR: enable / disable sparse FS support, to make files with many zeroes smaller on disk\. Creating sparse files may save disk space and speed up decompression by reducing the amount of disk I/O\. default: enabled when output is into a file, and disabled when output is stdout\. This setting overrides default and can force sparse mode over stdout\. diff --git a/programs/zstd.1.md b/programs/zstd.1.md index 569ca1aa0..c78fd4abf 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -212,7 +212,7 @@ the last one takes effect. disable input and output checks. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc. * `-c`, `--stdout`: - write to standard output (even if it is the console) + write to standard output (even if it is the console); keep original files unchanged. * `--[no-]sparse`: enable / disable sparse FS support, to make files with many zeroes smaller on disk. diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 0b9b82a98..6c200bc98 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -178,7 +178,7 @@ static void usage_advanced(const char* programName) DISPLAYOUT( "Advanced arguments : \n"); DISPLAYOUT( " -V : display Version number and exit \n"); - DISPLAYOUT( " -c : write to standard output (even if it is the console) \n"); + DISPLAYOUT( " -c : write to standard output (even if it is the console), keep original file \n"); DISPLAYOUT( " -v : verbose mode; specify multiple times to increase verbosity \n"); DISPLAYOUT( " -q : suppress warnings; specify twice to suppress errors too \n"); @@ -925,7 +925,7 @@ int main(int argCount, const char* argv[]) if (!strcmp(argument, "--help")) { usage_advanced(programName); CLEAN_RETURN(0); } if (!strcmp(argument, "--verbose")) { g_displayLevel++; continue; } if (!strcmp(argument, "--quiet")) { g_displayLevel--; continue; } - if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; g_displayLevel-=(g_displayLevel==2); continue; } + if (!strcmp(argument, "--stdout")) { forceStdout=1; outFileName=stdoutmark; FIO_setRemoveSrcFile(prefs, 0); g_displayLevel-=(g_displayLevel==2); continue; } if (!strcmp(argument, "--ultra")) { ultra=1; continue; } if (!strcmp(argument, "--check")) { FIO_setChecksumFlag(prefs, 2); continue; } if (!strcmp(argument, "--no-check")) { FIO_setChecksumFlag(prefs, 0); continue; } @@ -1114,7 +1114,7 @@ int main(int argCount, const char* argv[]) operation=zom_decompress; argument++; break; /* Force stdout, even if stdout==console */ - case 'c': forceStdout=1; outFileName=stdoutmark; argument++; break; + case 'c': forceStdout=1; outFileName=stdoutmark; FIO_setRemoveSrcFile(prefs, 0); argument++; break; /* do not store filename - gzip compatibility - nothing to do */ case 'n': argument++; break; @@ -1279,7 +1279,7 @@ int main(int argCount, const char* argv[]) } nbInputFileNames = filenames->tableSize; /* saving number of input files */ - + if (recursive) { /* at this stage, filenameTable is a list of paths, which can contain both files and directories */ UTIL_expandFNT(&filenames, followLinks); } @@ -1392,7 +1392,7 @@ int main(int argCount, const char* argv[]) } UTIL_refFilename(filenames, stdinmark); } - + if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName) outFileName = stdoutmark; /* when input is stdin, default output is stdout */ diff --git a/tests/cli-tests/compression/basic.sh b/tests/cli-tests/compression/basic.sh index 8b63e4076..b6e2aa045 100755 --- a/tests/cli-tests/compression/basic.sh +++ b/tests/cli-tests/compression/basic.sh @@ -24,6 +24,10 @@ zstd -c file | zstd -t zstd --stdout file | zstd -t println bob | zstd | zstd -t +# Test keeping input file when compressing to stdout in gzip mode +$ZSTD_SYMLINK_DIR/gzip -c file | zstd -t ; test -f file +$ZSTD_SYMLINK_DIR/gzip --stdout file | zstd -t ; test -f file + # Test --rm cp file file-rm zstd --rm file-rm; zstd -t file-rm.zst From 696fa2524a584d4e77c55d3a639d2e0283bd919f Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Wed, 9 Mar 2022 14:39:13 -0800 Subject: [PATCH 108/472] [doc] Add decompressor errata document Add a document that lists the known bugs in the decoder where valid frames are rejected, along with the version that they were fixed. --- doc/decompressor_errata.md | 84 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 doc/decompressor_errata.md diff --git a/doc/decompressor_errata.md b/doc/decompressor_errata.md new file mode 100644 index 000000000..9c1126401 --- /dev/null +++ b/doc/decompressor_errata.md @@ -0,0 +1,84 @@ +Decompressor Errata +=================== + +This document captures known decompressor bugs, where the decompressor rejects a valid zstd frame. +Each entry will contain: +1. The last affected decompressor versions. +2. The decompressor components affected. +2. Whether the compressed frame could ever be produced by the reference compressor. +3. An example frame. +4. A description of the bug. + +The document is in reverse chronological order, with the bugs that affect the most recent zstd decompressor versions listed first. + + +Compressed block with 0 literals and 0 sequences +------------------------------------------------ + +**Last affected version**: v1.5.2 + +**Affected decompressor component(s)**: Library & CLI + +**Produced by the reference compressor**: No + +**Example Frame**: `28b5 2ffd 2000 1500 0000 00` + +The zstd decoder incorrectly rejected blocks of type `Compressed_Block` that encodes literals as `Raw_Literals_Block` with no literals, and has no sequences. + +This type of block was never generated by the reference compressor. + +Additionally, these blocks were disallowed by the spec up until spec version 0.3.2 when the restriciton was lifted by [PR#1689](https://github.com/facebook/zstd/pull/1689). + +> A Compressed_Block has the extra restriction that Block_Size is always strictly less than the decompressed size. If this condition cannot be respected, the block must be sent uncompressed instead (Raw_Block). + +First block is RLE block +------------------------ + +**Last affected version**: v1.4.3 + +**Affected decompressor component(s)**: CLI only + +**Produced by the reference compressor**: No + +**Example Frame**: `28b5 2ffd a001 0002 0002 0010 000b 0000 00` + +The zstd CLI decompressor rejected cases where the first block was an RLE block whose `Block_Size` is 131072, and the frame contains more than one block. +This only affected the zstd CLI, and not the library. + +The example is an RLE block with 131072 bytes, followed by a second RLE block with 1 byte. + +The compressor currently works around this limitation by explicitly avoiding producing RLE blocks as the first +block. + +https://github.com/facebook/zstd/blob/8814aa5bfa74f05a86e55e9d508da177a893ceeb/lib/compress/zstd_compress.c#L3527-L3535 + +Tiny FSE Table & Block +---------------------- + +**Last affected version**: v1.3.4 + +**Affected decompressor component(s)**: Library & CLI + +**Produced by the reference compressor**: Possibly until version v1.3.4, but probably never + +**Example Frame**: `28b5 2ffd 2027 c500 0080 f3f1 f0ec ebc6 c5c7 f09d 4300 0000 e0e0 0658 0100 603e 52` + +The zstd library rejected blocks of type `Compressed_Block` whose offset of the last table with type `FSE_Compressed_Mode` was less than 4 bytes from the end of the block. + +In more depth, let `Last_Table_Offset` be the offset in the compressed block (excluding the header) that +the last table with type `FSE_Compressed_Mode` started. If `Block_Content - Last_Table_Offset < 4` then +the buggy zstd decompressor would reject the block. This occurs when the last serialized table is 2 bytes +and the bitstream size is 1 byte. + +For example: +* There is 1 sequence in the block +* `Literals_Lengths_Mode` is `FSE_Compressed_Mode` & the serialized table size is 2 bytes +* `Offsets_Mode` is `Predefined_Mode` +* `Match_Lengths_Mode` is `Predefined_Mode` +* The bitstream is 1 byte. E.g. there is only one sequence and it fits in 1 byte. + +The total `Block_Content` is `5` bytes, and `Last_Table_Offset` is `2`. + +See the compressor workaround code: + +https://github.com/facebook/zstd/blob/8814aa5bfa74f05a86e55e9d508da177a893ceeb/lib/compress/zstd_compress.c#L2667-L2682 From 498ac8238d98cc5f7153fa58a5e0a5222ffd88be Mon Sep 17 00:00:00 2001 From: Cyber Knight Date: Thu, 10 Mar 2022 15:32:13 +0800 Subject: [PATCH 109/472] [contrib][linux] Make zstd_reset_cstream() functionally identical to ZSTD_resetCStream() - As referenced by Nick Terrelln ~ the ZSTD maintainer in the linux kernel, making zstd_reset_cstream() functionally identical to ZSTD_resetCStream() would be the perfect way to fix the warning without touching any core functions or breaking other parts of the code. Suggested-by: Nick Terrell Signed-off-by: Cyber Knight --- contrib/linux-kernel/zstd_compress_module.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contrib/linux-kernel/zstd_compress_module.c b/contrib/linux-kernel/zstd_compress_module.c index 8b4c764d4..04e1b5c01 100644 --- a/contrib/linux-kernel/zstd_compress_module.c +++ b/contrib/linux-kernel/zstd_compress_module.c @@ -131,9 +131,13 @@ zstd_cstream *zstd_init_cstream(const zstd_parameters *parameters, EXPORT_SYMBOL(zstd_init_cstream); size_t zstd_reset_cstream(zstd_cstream *cstream, - unsigned long long pledgedSrcSize) + unsigned long long pledged_src_size) { - return ZSTD_CCtx_setPledgedSrcSize(cstream, pledgedSrcSize); + if (pledged_src_size == 0) + pledged_src_size = ZSTD_CONTENTSIZE_UNKNOWN; + ZSTD_FORWARD_IF_ERR( ZSTD_CCtx_reset(cstream, ZSTD_reset_session_only) ); + ZSTD_FORWARD_IF_ERR( ZSTD_CCtx_setPledgedSrcSize(cstream, pledged_src_size) ); + return 0; } EXPORT_SYMBOL(zstd_reset_cstream); From 7a3997c21a6e7620eaf6562b69326e23ffdde23d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dirk=20M=C3=BCller?= Date: Thu, 10 Mar 2022 00:25:05 +0100 Subject: [PATCH 110/472] Handle newer less versions in zstdless testing Newer less versions appear to have changed how stderr and stdout are showing error messages. hardcode the expected behavior to make the tests pass with any less version. Also set locale to C so that the strings are matching. --- tests/cli-tests/cltools/zstdless.sh | 2 +- tests/cli-tests/run.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/cli-tests/cltools/zstdless.sh b/tests/cli-tests/cltools/zstdless.sh index 61f768862..a0697bde6 100755 --- a/tests/cli-tests/cltools/zstdless.sh +++ b/tests/cli-tests/cltools/zstdless.sh @@ -7,4 +7,4 @@ zstdless file.zst println "+ pass parameters" zstdless -N file.zst # This parameter does not produce line #s when piped, but still serves to test that the flag went to less and not zstd println "+ bad path" -zstdless bad.zst +zstdless bad.zst >&2 diff --git a/tests/cli-tests/run.py b/tests/cli-tests/run.py index 9bba2ecd1..b91aa9841 100755 --- a/tests/cli-tests/run.py +++ b/tests/cli-tests/run.py @@ -704,6 +704,7 @@ if __name__ == "__main__": env["ZSTDLESS_BIN"] = os.path.abspath(args.zstdless) env["COMMON"] = os.path.abspath(os.path.join(args.test_dir, "common")) env["PATH"] = bin_dir + ":" + os.getenv("PATH", "") + env["LC_ALL"] = "C" opts = Options( env=env, From b772f53952fa167e3c8d5630b26397e8d4fb4c5b Mon Sep 17 00:00:00 2001 From: Dominique Pelle Date: Sat, 12 Mar 2022 08:52:40 +0100 Subject: [PATCH 111/472] Typo and grammar fixes --- .github/ISSUE_TEMPLATE/bug_report.md | 4 ++-- CONTRIBUTING.md | 20 ++++++++++---------- build/cmake/README.md | 4 ++-- build/single_file_libs/build_decoder_test.sh | 2 +- build/single_file_libs/build_library_test.sh | 2 +- build/single_file_libs/combine.py | 2 +- build/single_file_libs/zstd-in.c | 2 +- build/single_file_libs/zstddeclib-in.c | 2 +- contrib/match_finders/README.md | 8 ++++---- contrib/match_finders/zstd_edist.c | 14 +++++++------- contrib/match_finders/zstd_edist.h | 8 ++++---- contrib/pzstd/utils/ScopeGuard.h | 2 +- doc/zstd_compression_format.md | 2 +- doc/zstd_manual.html | 6 +++--- lib/README.md | 2 +- lib/common/bitstream.h | 2 +- lib/common/fse.h | 2 +- lib/common/fse_decompress.c | 4 ++-- lib/common/xxhash.h | 4 ++-- lib/compress/zstd_compress.c | 4 ++-- lib/compress/zstd_compress_sequences.c | 4 ++-- lib/compress/zstd_compress_superblock.c | 2 +- lib/compress/zstd_lazy.c | 2 +- lib/compress/zstd_ldm.c | 2 +- lib/compress/zstdmt_compress.c | 2 +- lib/decompress/zstd_decompress.c | 10 +++++----- lib/decompress/zstd_decompress_block.c | 8 ++++---- lib/dictBuilder/cover.c | 2 +- lib/dictBuilder/fastcover.c | 2 +- lib/dll/example/README.md | 2 +- lib/legacy/zstd_v02.c | 4 ++-- lib/legacy/zstd_v03.c | 4 ++-- lib/legacy/zstd_v04.c | 4 ++-- lib/legacy/zstd_v05.c | 4 ++-- lib/legacy/zstd_v06.c | 4 ++-- lib/legacy/zstd_v07.c | 4 ++-- lib/zdict.h | 4 ++-- lib/zstd.h | 8 ++++---- programs/benchfn.h | 2 +- programs/fileio.c | 4 ++-- programs/util.c | 2 +- programs/zstd.1 | 4 ++-- programs/zstd.1.md | 12 ++++++------ programs/zstdcli.c | 2 +- tests/README.md | 6 +++--- tests/automated_benchmarking.py | 2 +- tests/fuzz/fuzz.py | 2 +- tests/fuzz/sequence_compression_api.c | 2 +- tests/fuzz/simple_compress.c | 2 +- tests/fuzzer.c | 14 +++++++------- tests/paramgrill.c | 2 +- zlibWrapper/README.md | 2 +- 52 files changed, 113 insertions(+), 113 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index bacdac27b..755a46af1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -26,8 +26,8 @@ If applicable, add screenshots and charts to help explain your problem. **Desktop (please complete the following information):** - OS: [e.g. Mac] - Version [e.g. 22] - - Compiler [e.g gcc] - - Flags [e.g O2] + - Compiler [e.g. gcc] + - Flags [e.g. O2] - Other relevant hardware specs [e.g. Dual-core] - Build system [e.g. Makefile] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e7e545129..f5e747ae1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ New versions are being developed in the "dev" branch, or in their own feature branch. When they are deemed ready for a release, they are merged into "release". -As a consequences, all contributions must stage first through "dev" +As a consequence, all contributions must stage first through "dev" or their own feature branch. ## Pull Requests @@ -134,11 +134,11 @@ It can be useful to look at additional static analyzers once in a while (and we - Static analyzers are full of false positive. The signal to noise ratio is actually pretty low. - A good CI policy is "zero-warning tolerance". That means that all issues must be solved, including false positives. This quickly becomes a tedious workload. - Multiple static analyzers will feature multiple kind of false positives, sometimes applying to the same code but in different ways leading to : - + torteous code, trying to please multiple constraints, hurting readability and therefore maintenance. Sometimes, such complexity introduce other more subtle bugs, that are just out of scope of the analyzers. + + tortuous code, trying to please multiple constraints, hurting readability and therefore maintenance. Sometimes, such complexity introduce other more subtle bugs, that are just out of scope of the analyzers. + sometimes, these constraints are mutually exclusive : if one try to solve one, the other static analyzer will complain, they can't be both happy at the same time. - As if that was not enough, the list of false positives change with each version. It's hard enough to follow one static analyzer, but multiple ones with their own update agenda, this quickly becomes a massive velocity reducer. -This is different from running a static analyzer once in a while, looking at the output, and __cherry picking__ a few warnings that seem helpful, either because they detected a genuine risk of bug, or because it helps expressing the code in a way which is more readable or more difficult to misuse. These kind of reports can be useful, and are accepted. +This is different from running a static analyzer once in a while, looking at the output, and __cherry picking__ a few warnings that seem helpful, either because they detected a genuine risk of bug, or because it helps expressing the code in a way which is more readable or more difficult to misuse. These kinds of reports can be useful, and are accepted. ## Continuous Integration CI tests run every time a pull request (PR) is created or updated. The exact tests @@ -197,7 +197,7 @@ something subtle merged is extensive benchmarking. You will be doing us a great take the time to run extensive, long-duration, and potentially cross-(os, platform, process, etc) benchmarks on your end before submitting a PR. Of course, you will not be able to benchmark your changes on every single processor and os out there (and neither will we) but do that best -you can:) We've adding some things to think about when benchmarking below in the Benchmarking +you can:) We've added some things to think about when benchmarking below in the Benchmarking Performance section which might be helpful for you. 3. Optimizing performance for a certain OS, processor vendor, compiler, or network system is a perfectly legitimate thing to do as long as it does not harm the overall performance health of Zstd. @@ -273,7 +273,7 @@ for that options you have just provided. If you want to look at the internals of benchmarking script works, you can check out programs/benchzstd.c For example: say you have made a change that you believe improves the speed of zstd level 1. The -very first thing you should use to asses whether you actually achieved any sort of improvement +very first thing you should use to assess whether you actually achieved any sort of improvement is `zstd -b`. You might try to do something like this. Note: you can use the `-i` option to specify a running time for your benchmark in seconds (default is 3 seconds). Usually, the longer the running time, the more stable your results will be. @@ -299,7 +299,7 @@ this method of evaluation will not be sufficient. ### Profiling There are a number of great profilers out there. We're going to briefly mention how you can profile your code using `instruments` on mac, `perf` on linux and `visual studio profiler` -on windows. +on Windows. Say you have an idea for a change that you think will provide some good performance gains for level 1 compression on Zstd. Typically this means, you have identified a section of @@ -315,8 +315,8 @@ might be). Most profilers (including the profilers discussed below) will generate a call graph of functions for you. Your goal will be to find your function of interest in this call graph -and then inspect the time spent inside of it. You might also want to to look at the -annotated assembly which most profilers will provide you with. +and then inspect the time spent inside of it. You might also want to look at the annotated +assembly which most profilers will provide you with. #### Instruments We will once again consider the scenario where you think you've identified a piece of code @@ -330,7 +330,7 @@ Instruments. * You will want a benchmark that runs for at least a few seconds (5 seconds will usually be long enough). This way the profiler will have something to work with and you will have ample time to attach your profiler to this process:) - * I will just use benchzstd as my bencharmking script for this example: + * I will just use benchzstd as my benchmarmking script for this example: ``` $ zstd -b1 -i5 # this will run for 5 seconds ``` @@ -455,7 +455,7 @@ This design requirement is fundamental to preserve the portability of the code b Any variable that can be `const` (aka. read-only) **must** be `const`. Any pointer which content will not be modified must be `const`. This property is then controlled at compiler level. - `const` variables are an important signal to readers that this variable isn’t modified. + `const` variables are an important signal to readers that this variable isn't modified. Conversely, non-const variables are a signal to readers to watch out for modifications later on in the function. * If a function must be inlined, mention it explicitly, using project's own portable macros, such as `FORCE_INLINE_ATTR`, diff --git a/build/cmake/README.md b/build/cmake/README.md index f6854f4c0..a460dd161 100644 --- a/build/cmake/README.md +++ b/build/cmake/README.md @@ -1,13 +1,13 @@ # Cmake contributions Contributions to the cmake build configurations are welcome. Please -use case sensitivity that matches modern (ie. cmake version 2.6 and above) +use case sensitivity that matches modern (i.e. cmake version 2.6 and above) conventions of using lower-case for commands, and upper-case for variables. ## How to build -As cmake doesn't support command like `cmake clean`, it's recommended to perform a "out of source build". +As cmake doesn't support command like `cmake clean`, it's recommended to perform an "out of source build". To do this, you can create a new directory and build in it: ```sh cd build/cmake diff --git a/build/single_file_libs/build_decoder_test.sh b/build/single_file_libs/build_decoder_test.sh index 48d017fcf..c4ca55fa5 100755 --- a/build/single_file_libs/build_decoder_test.sh +++ b/build/single_file_libs/build_decoder_test.sh @@ -11,7 +11,7 @@ IN_FILES="examples/emscripten.c" # Emscripten build using emcc. emscripten_emcc_build() { - # Compile the the same example as above + # Compile the same example as above CC_FLAGS="-Wall -Wextra -Wshadow -Werror -Os -g0 -flto" emcc $CC_FLAGS -s WASM=1 -I. -o $OUT_WASM $IN_FILES # Did compilation work? diff --git a/build/single_file_libs/build_library_test.sh b/build/single_file_libs/build_library_test.sh index 31545fc3f..f4ba109ab 100755 --- a/build/single_file_libs/build_library_test.sh +++ b/build/single_file_libs/build_library_test.sh @@ -14,7 +14,7 @@ IN_FILES="zstd.c examples/roundtrip.c" # Emscripten build using emcc. emscripten_emcc_build() { - # Compile the the same example as above + # Compile the same example as above CC_FLAGS="-Wall -Wextra -Wshadow -Werror -Os -g0 -flto" emcc $CC_FLAGS -s WASM=1 -I. -o $OUT_WASM $IN_FILES # Did compilation work? diff --git a/build/single_file_libs/combine.py b/build/single_file_libs/combine.py index 3d91dc3ee..771dd20bf 100755 --- a/build/single_file_libs/combine.py +++ b/build/single_file_libs/combine.py @@ -107,7 +107,7 @@ def test_match_pragma() -> bool: return False # Finds 'file'. First the list of 'root' paths are searched, followed by the -# the currently processing file's 'parent' path, returning a valid Path in +# currently processing file's 'parent' path, returning a valid Path in # canonical form. If no match is found None is returned. # def resolve_include(file: str, parent: Optional[Path] = None) -> Optional[Path]: diff --git a/build/single_file_libs/zstd-in.c b/build/single_file_libs/zstd-in.c index eecd9a688..59c6b5f19 100644 --- a/build/single_file_libs/zstd-in.c +++ b/build/single_file_libs/zstd-in.c @@ -25,7 +25,7 @@ * Note: MEM_MODULE stops xxhash redefining BYTE, U16, etc., which are also * defined in mem.h (breaking C99 compatibility). * - * Note: the undefs for xxHash allow Zstd's implementation to coincide with with + * Note: the undefs for xxHash allow Zstd's implementation to coincide with * standalone xxHash usage (with global defines). * * Note: if you enable ZSTD_LEGACY_SUPPORT the combine.py script will need diff --git a/build/single_file_libs/zstddeclib-in.c b/build/single_file_libs/zstddeclib-in.c index d0343c54a..5a58589c9 100644 --- a/build/single_file_libs/zstddeclib-in.c +++ b/build/single_file_libs/zstddeclib-in.c @@ -25,7 +25,7 @@ * Note: MEM_MODULE stops xxhash redefining BYTE, U16, etc., which are also * defined in mem.h (breaking C99 compatibility). * - * Note: the undefs for xxHash allow Zstd's implementation to coincide with with + * Note: the undefs for xxHash allow Zstd's implementation to coincide with * standalone xxHash usage (with global defines). * * Note: if you enable ZSTD_LEGACY_SUPPORT the combine.py script will need diff --git a/contrib/match_finders/README.md b/contrib/match_finders/README.md index 0f4a3b1ce..54055c370 100644 --- a/contrib/match_finders/README.md +++ b/contrib/match_finders/README.md @@ -14,7 +14,7 @@ * files would be small relative to the size of the file. * * Various 'diffing' algorithms utilize this notion of edit distance and - * the corrensponding concept of a minimal edit script between two + * the corresponding concept of a minimal edit script between two * sequences to identify the regions within two files where they differ. * The core algorithm used in this match finder is described in: * @@ -28,12 +28,12 @@ * * Note: after some experimentation, this approach proved to not provide enough * utility to justify the additional CPU used in finding matches. The one area - * where this approach consistenly outperforms Zstandard even on level 19 is - * when compressing small files (<10 KB) using a equally small dictionary that + * where this approach consistently outperforms Zstandard even on level 19 is + * when compressing small files (<10 KB) using an equally small dictionary that * is very similar to the source file. For the use case that this was intended, * (large similar files) this approach by itself took 5-10X longer than zstd-19 and * generally resulted in 2-3X larger files. The core advantage that zstd-19 has - * over this appraoch for match finding is the overlapping matches. This approach + * over this approach for match finding is the overlapping matches. This approach * cannot find any. * * I'm leaving this in the contrib section in case this ever becomes interesting diff --git a/contrib/match_finders/zstd_edist.c b/contrib/match_finders/zstd_edist.c index aab545fd3..b5523f4e4 100644 --- a/contrib/match_finders/zstd_edist.c +++ b/contrib/match_finders/zstd_edist.c @@ -12,7 +12,7 @@ * Dependencies ***************************************/ -/* Currently relies on qsort when combining contiguous matches. This can probabily +/* Currently relies on qsort when combining contiguous matches. This can probably * be avoided but would require changes to the algorithm. The qsort is far from * the bottleneck in this algorithm even for medium sized files so it's probably * not worth trying to address */ @@ -26,7 +26,7 @@ * Constants ***************************************/ -/* Just a sential for the entires of the diagnomal matrix */ +/* Just a sential for the entires of the diagonal matrix */ #define ZSTD_EDIST_DIAG_MAX (S32)(1 << 30) /* How large should a snake be to be considered a 'big' snake. @@ -39,7 +39,7 @@ #define ZSTD_EDIST_SNAKE_ITER_THRESH 200 /* After how many iterations should be just give up and take - * the best availabe edit script for this round */ + * the best available edit script for this round */ #define ZSTD_EDIST_EXPENSIVE_THRESH 1024 /*-************************************* @@ -192,7 +192,7 @@ static void ZSTD_eDist_diag(ZSTD_eDist_state* state, if (!useHeuristics) continue; - /* Everything under this point is a heuritic. Using these will + /* Everything under this point is a heuristic. Using these will * substantially speed up the match finding. In some cases, taking * the total match finding time from several minutes to seconds. * Of course, the caveat is that the edit script found may no longer @@ -366,8 +366,8 @@ static int ZSTD_eDist_compare(ZSTD_eDist_state* state, } } else if (srcLow == srcHigh) { while (dictLow < dictHigh) { - /* Reaching this point means deleteing dict[dictLow] from - * the current positino of dict */ + /* Reaching this point means deleting dict[dictLow] from + * the current position of dict */ dictLow++; } } else { @@ -395,7 +395,7 @@ static int ZSTD_eDist_matchComp(const void* p, const void* q) } /* The matches from the approach above will all be of the form - * (dictIdx, srcIdx, 1). this method combines contiguous matches + * (dictIdx, srcIdx, 1). This method combines contiguous matches * of length MINMATCH or greater. Matches less than MINMATCH * are discarded */ static void ZSTD_eDist_combineMatches(ZSTD_eDist_state* state) diff --git a/contrib/match_finders/zstd_edist.h b/contrib/match_finders/zstd_edist.h index c775a4985..a947649b2 100644 --- a/contrib/match_finders/zstd_edist.h +++ b/contrib/match_finders/zstd_edist.h @@ -21,7 +21,7 @@ * files would be small relative to the size of the file. * * Various 'diffing' algorithms utilize this notion of edit distance and - * the corrensponding concept of a minimal edit script between two + * the corresponding concept of a minimal edit script between two * sequences to identify the regions within two files where they differ. * The core algorithm used in this match finder is described in: * @@ -35,12 +35,12 @@ * * Note: after some experimentation, this approach proved to not provide enough * utility to justify the additional CPU used in finding matches. The one area - * where this approach consistenly outperforms Zstandard even on level 19 is - * when compressing small files (<10 KB) using a equally small dictionary that + * where this approach consistently outperforms Zstandard even on level 19 is + * when compressing small files (<10 KB) using an equally small dictionary that * is very similar to the source file. For the use case that this was intended, * (large similar files) this approach by itself took 5-10X longer than zstd-19 and * generally resulted in 2-3X larger files. The core advantage that zstd-19 has - * over this appraoch for match finding is the overlapping matches. This approach + * over this approach for match finding is the overlapping matches. This approach * cannot find any. * * I'm leaving this in the contrib section in case this ever becomes interesting diff --git a/contrib/pzstd/utils/ScopeGuard.h b/contrib/pzstd/utils/ScopeGuard.h index 31768f43d..c26f911bf 100644 --- a/contrib/pzstd/utils/ScopeGuard.h +++ b/contrib/pzstd/utils/ScopeGuard.h @@ -15,7 +15,7 @@ namespace pzstd { /** * Dismissable scope guard. * `Function` must be callable and take no parameters. - * Unless `dissmiss()` is called, the callable is executed upon destruction of + * Unless `dismiss()` is called, the callable is executed upon destruction of * `ScopeGuard`. * * Example: diff --git a/doc/zstd_compression_format.md b/doc/zstd_compression_format.md index fc09bd553..cd53b7f94 100644 --- a/doc/zstd_compression_format.md +++ b/doc/zstd_compression_format.md @@ -974,7 +974,7 @@ and their content ignored, resuming decoding after the skippable frame. It can be noted that a skippable frame can be used to watermark a stream of concatenated frames -embedding any kind of tracking information (even just an UUID). +embedding any kind of tracking information (even just a UUID). Users wary of such possibility should scan the stream of concatenated frames in an attempt to detect such frame for analysis or removal. diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index 6b45e0a99..4bbb513bb 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -790,11 +790,11 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */


unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
-

Provides the dictID required to decompressed the frame stored within `src`. +

Provides the dictID required to decompress the frame stored within `src`. If @return == 0, the dictID could not be decoded. This could for one of the following reasons : - The frame does not require a dictionary to be decoded (most common case). - - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information. + - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information. Note : this use case also happens when using a non-conformant dictionary. - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). - This is not a Zstandard frame. @@ -1164,7 +1164,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);

ZSTDLIB_STATIC_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize,
                       const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
                       const void* src, size_t srcSize);
-

Compress an array of ZSTD_Sequence, associted with @src buffer, into dst. +

Compress an array of ZSTD_Sequence, associated with @src buffer, into dst. @src contains the entire input (not just the literals). If @srcSize > sum(sequence.length), the remaining bytes are considered all literals If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) diff --git a/lib/README.md b/lib/README.md index 4c9d8f059..015cde567 100644 --- a/lib/README.md +++ b/lib/README.md @@ -91,7 +91,7 @@ The file structure is designed to make this selection manually achievable for an `ZSTD_LIB_COMPRESSION, ZSTD_LIB_DECOMPRESSION`, `ZSTD_LIB_DICTBUILDER`, and `ZSTD_LIB_DEPRECATED` as `0` to forgo compilation of the corresponding features. This will also disable compilation of all - dependencies (eg. `ZSTD_LIB_COMPRESSION=0` will also disable + dependencies (e.g. `ZSTD_LIB_COMPRESSION=0` will also disable dictBuilder). - There are a number of options that can help minimize the binary size of diff --git a/lib/common/bitstream.h b/lib/common/bitstream.h index 731630ea4..841778626 100644 --- a/lib/common/bitstream.h +++ b/lib/common/bitstream.h @@ -365,7 +365,7 @@ MEM_STATIC FORCE_INLINE_ATTR size_t BIT_readBits(BIT_DStream_t* bitD, unsigned n } /*! BIT_readBitsFast() : - * unsafe version; only works only if nbBits >= 1 */ + * unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits) { size_t const value = BIT_lookBitsFast(bitD, nbBits); diff --git a/lib/common/fse.h b/lib/common/fse.h index bd29e9ac5..466a07281 100644 --- a/lib/common/fse.h +++ b/lib/common/fse.h @@ -555,7 +555,7 @@ MEM_STATIC void FSE_flushCState(BIT_CStream_t* bitC, const FSE_CState_t* statePt /* FSE_getMaxNbBits() : * Approximate maximum cost of a symbol, in bits. - * Fractional get rounded up (i.e : a symbol with a normalized frequency of 3 gives the same result as a frequency of 2) + * Fractional get rounded up (i.e. a symbol with a normalized frequency of 3 gives the same result as a frequency of 2) * note 1 : assume symbolValue is valid (<= maxSymbolValue) * note 2 : if freq[symbolValue]==0, @return a fake cost of tableLog+1 bits */ MEM_STATIC U32 FSE_getMaxNbBits(const void* symbolTTPtr, U32 symbolValue) diff --git a/lib/common/fse_decompress.c b/lib/common/fse_decompress.c index 184b35dd1..7034fd97b 100644 --- a/lib/common/fse_decompress.c +++ b/lib/common/fse_decompress.c @@ -128,10 +128,10 @@ static size_t FSE_buildDTable_internal(FSE_DTable* dt, const short* normalizedCo } } /* Now we spread those positions across the table. - * The benefit of doing it in two stages is that we avoid the the + * The benefit of doing it in two stages is that we avoid the * variable size inner loop, which caused lots of branch misses. * Now we can run through all the positions without any branch misses. - * We unroll the loop twice, since that is what emperically worked best. + * We unroll the loop twice, since that is what empirically worked best. */ { size_t position = 0; diff --git a/lib/common/xxhash.h b/lib/common/xxhash.h index 8ebbfdd62..acac7ad62 100644 --- a/lib/common/xxhash.h +++ b/lib/common/xxhash.h @@ -1534,7 +1534,7 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) { return ZSTD_ * @brief Used to prevent unwanted optimizations for @p var. * * It uses an empty GCC inline assembly statement with a register constraint - * which forces @p var into a general purpose register (eg eax, ebx, ecx + * which forces @p var into a general purpose register (e.g. eax, ebx, ecx * on x86) and marks it as modified. * * This is used in a few places to avoid unwanted autovectorization (e.g. @@ -2809,7 +2809,7 @@ enum XXH_VECTOR_TYPE /* fake enum */ { * @ingroup tuning * @brief Selects the minimum alignment for XXH3's accumulators. * - * When using SIMD, this should match the alignment reqired for said vector + * When using SIMD, this should match the alignment required for said vector * type, so, for example, 32 for AVX2. * * Default: Auto detected. diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index aa1a9f35b..e43bbec44 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -4211,7 +4211,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, const BYTE* const iend = ip + srcSize; int const loadLdmDict = params->ldmParams.enableLdm == ZSTD_ps_enable && ls != NULL; - /* Assert that we the ms params match the params we're being given */ + /* Assert that the ms params match the params we're being given */ ZSTD_assertEqualCParams(params->cParams, ms->cParams); if (srcSize > ZSTD_CHUNKSIZE_MAX) { @@ -5820,7 +5820,7 @@ ZSTD_validateSequence(U32 offCode, U32 matchLength, size_t posInSrc, U32 windowLog, size_t dictSize) { U32 const windowSize = 1 << windowLog; - /* posInSrc represents the amount of data the the decoder would decode up to this point. + /* posInSrc represents the amount of data the decoder would decode up to this point. * As long as the amount of data decoded is less than or equal to window size, offsets may be * larger than the total length of output decoded in order to reference the dict, even larger than * window size. After output surpasses windowSize, we're limited to windowSize offsets again. diff --git a/lib/compress/zstd_compress_sequences.c b/lib/compress/zstd_compress_sequences.c index f1e40af2e..2c1eee567 100644 --- a/lib/compress/zstd_compress_sequences.c +++ b/lib/compress/zstd_compress_sequences.c @@ -58,7 +58,7 @@ static unsigned ZSTD_useLowProbCount(size_t const nbSeq) { /* Heuristic: This should cover most blocks <= 16K and * start to fade out after 16K to about 32K depending on - * comprssibility. + * compressibility. */ return nbSeq >= 2048; } @@ -166,7 +166,7 @@ ZSTD_selectEncodingType( if (mostFrequent == nbSeq) { *repeatMode = FSE_repeat_none; if (isDefaultAllowed && nbSeq <= 2) { - /* Prefer set_basic over set_rle when there are 2 or less symbols, + /* Prefer set_basic over set_rle when there are 2 or fewer symbols, * since RLE uses 1 byte, but set_basic uses 5-6 bits per symbol. * If basic encoding isn't possible, always choose RLE. */ diff --git a/lib/compress/zstd_compress_superblock.c b/lib/compress/zstd_compress_superblock.c index 5e89a706c..eed58e7cf 100644 --- a/lib/compress/zstd_compress_superblock.c +++ b/lib/compress/zstd_compress_superblock.c @@ -36,7 +36,7 @@ * If it is set_compressed, first sub-block's literals section will be Treeless_Literals_Block * and the following sub-blocks' literals sections will be Treeless_Literals_Block. * @return : compressed size of literals section of a sub-block - * Or 0 if it unable to compress. + * Or 0 if unable to compress. * Or error code */ static size_t ZSTD_compressSubBlock_literal(const HUF_CElt* hufTable, diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 278995491..7f97e12a5 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -951,7 +951,7 @@ void ZSTD_row_update(ZSTD_matchState_t* const ms, const BYTE* ip) { const U32 mls = MIN(ms->cParams.minMatch, 6 /* mls caps out at 6 */); DEBUGLOG(5, "ZSTD_row_update(), rowLog=%u", rowLog); - ZSTD_row_update_internal(ms, ip, mls, rowLog, rowMask, 0 /* dont use cache */); + ZSTD_row_update_internal(ms, ip, mls, rowLog, rowMask, 0 /* don't use cache */); } #if defined(ZSTD_ARCH_X86_SSE2) diff --git a/lib/compress/zstd_ldm.c b/lib/compress/zstd_ldm.c index 1c04a36f9..e1d2f7410 100644 --- a/lib/compress/zstd_ldm.c +++ b/lib/compress/zstd_ldm.c @@ -549,7 +549,7 @@ size_t ZSTD_ldm_generateSequences( * the window through early invalidation. * TODO: * Test the chunk size. * * Try invalidation after the sequence generation and test the - * the offset against maxDist directly. + * offset against maxDist directly. * * NOTE: Because of dictionaries + sequence splitting we MUST make sure * that any offset used is valid at the END of the sequence, since it may diff --git a/lib/compress/zstdmt_compress.c b/lib/compress/zstdmt_compress.c index b0b337e42..4ac2249bd 100644 --- a/lib/compress/zstdmt_compress.c +++ b/lib/compress/zstdmt_compress.c @@ -1734,7 +1734,7 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) } } else { /* We have enough bytes buffered to initialize the hash, - * and are have processed enough bytes to find a sync point. + * and have processed enough bytes to find a sync point. * Start scanning at the beginning of the input. */ assert(mtctx->inBuff.filled >= RSYNC_MIN_BLOCK_SIZE); diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index 8950453f4..85f4d2202 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -1109,8 +1109,8 @@ size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t sr size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx) { return dctx->expected; } /** - * Similar to ZSTD_nextSrcSizeToDecompress(), but when when a block input can be streamed, - * we allow taking a partial block as the input. Currently only raw uncompressed blocks can + * Similar to ZSTD_nextSrcSizeToDecompress(), but when a block input can be streamed, we + * allow taking a partial block as the input. Currently only raw uncompressed blocks can * be streamed. * * For blocks that can be streamed, this allows us to reduce the latency until we produce @@ -1310,7 +1310,7 @@ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, c default: assert(0); /* impossible */ - RETURN_ERROR(GENERIC, "impossible to reach"); /* some compiler require default to do something */ + RETURN_ERROR(GENERIC, "impossible to reach"); /* some compilers require default to do something */ } } @@ -1516,7 +1516,7 @@ unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize) * This could for one of the following reasons : * - The frame does not require a dictionary (most common case). * - The frame was built with dictID intentionally removed. - * Needed dictionary is a hidden information. + * Needed dictionary is a hidden piece of information. * Note : this use case also happens when using a non-conformant dictionary. * - `srcSize` is too small, and as a result, frame header could not be decoded. * Note : possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`. @@ -2170,7 +2170,7 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB default: assert(0); /* impossible */ - RETURN_ERROR(GENERIC, "impossible to reach"); /* some compiler require default to do something */ + RETURN_ERROR(GENERIC, "impossible to reach"); /* some compilers require default to do something */ } } /* result */ diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index 6f8a75f53..7c046dab5 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -90,7 +90,7 @@ static void ZSTD_allocateLiteralsBuffer(ZSTD_DCtx* dctx, void* const dst, const dctx->litBufferEnd = dctx->litBuffer + litSize - ZSTD_LITBUFFEREXTRASIZE; } else { - /* initially this will be stored entirely in dst during huffman decoding, it will partially shifted to litExtraBuffer after */ + /* initially this will be stored entirely in dst during huffman decoding, it will partially be shifted to litExtraBuffer after */ dctx->litBuffer = (BYTE*)dst + expectedWriteSize - litSize; dctx->litBufferEnd = (BYTE*)dst + expectedWriteSize; } @@ -511,10 +511,10 @@ void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, } } /* Now we spread those positions across the table. - * The benefit of doing it in two stages is that we avoid the the + * The benefit of doing it in two stages is that we avoid the * variable size inner loop, which caused lots of branch misses. * Now we can run through all the positions without any branch misses. - * We unroll the loop twice, since that is what emperically worked best. + * We unroll the loop twice, since that is what empirically worked best. */ { size_t position = 0; @@ -1189,7 +1189,7 @@ ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets) U32 const ofnbBits = ofDInfo->nbBits; /* * As gcc has better branch and block analyzers, sometimes it is only - * valuable to mark likelyness for clang, it gives around 3-4% of + * valuable to mark likeliness for clang, it gives around 3-4% of * performance. */ diff --git a/lib/dictBuilder/cover.c b/lib/dictBuilder/cover.c index 949eb539b..724675d30 100644 --- a/lib/dictBuilder/cover.c +++ b/lib/dictBuilder/cover.c @@ -542,7 +542,7 @@ static void COVER_ctx_destroy(COVER_ctx_t *ctx) { /** * Prepare a context for dictionary building. - * The context is only dependent on the parameter `d` and can used multiple + * The context is only dependent on the parameter `d` and can be used multiple * times. * Returns 0 on success or error code on error. * The context must be destroyed with `COVER_ctx_destroy()`. diff --git a/lib/dictBuilder/fastcover.c b/lib/dictBuilder/fastcover.c index 3352859ad..63a2cee72 100644 --- a/lib/dictBuilder/fastcover.c +++ b/lib/dictBuilder/fastcover.c @@ -304,7 +304,7 @@ FASTCOVER_computeFrequency(U32* freqs, const FASTCOVER_ctx_t* ctx) /** * Prepare a context for dictionary building. - * The context is only dependent on the parameter `d` and can used multiple + * The context is only dependent on the parameter `d` and can be used multiple * times. * Returns 0 on success or error code on error. * The context must be destroyed with `FASTCOVER_ctx_destroy()`. diff --git a/lib/dll/example/README.md b/lib/dll/example/README.md index 9e30fd593..46aec7980 100644 --- a/lib/dll/example/README.md +++ b/lib/dll/example/README.md @@ -46,7 +46,7 @@ The compiled executable will require ZSTD DLL which is available at `dll\libzstd Open `example\fullbench-dll.sln` to compile `fullbench-dll` that uses a dynamic ZSTD library from the `dll` directory. The solution works with Visual C++ 2010 or newer. When one will open the solution with Visual C++ newer than 2010 -then the solution will upgraded to the current version. +then the solution will be upgraded to the current version. ## Using ZSTD DLL with Visual C++ diff --git a/lib/legacy/zstd_v02.c b/lib/legacy/zstd_v02.c index 2f473a757..6eadd3948 100644 --- a/lib/legacy/zstd_v02.c +++ b/lib/legacy/zstd_v02.c @@ -433,7 +433,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits) } /*! BIT_lookBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits) { const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -453,7 +453,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits) } /*!BIT_readBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits) { size_t value = BIT_lookBitsFast(bitD, nbBits); diff --git a/lib/legacy/zstd_v03.c b/lib/legacy/zstd_v03.c index 6625f4df1..72fc9140d 100644 --- a/lib/legacy/zstd_v03.c +++ b/lib/legacy/zstd_v03.c @@ -435,7 +435,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits) } /*! BIT_lookBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits) { const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -455,7 +455,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits) } /*!BIT_readBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits) { size_t value = BIT_lookBitsFast(bitD, nbBits); diff --git a/lib/legacy/zstd_v04.c b/lib/legacy/zstd_v04.c index 8d305c7ea..a2d281eb9 100644 --- a/lib/legacy/zstd_v04.c +++ b/lib/legacy/zstd_v04.c @@ -700,7 +700,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits) } /*! BIT_lookBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits) { const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -720,7 +720,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits) } /*!BIT_readBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits) { size_t value = BIT_lookBitsFast(bitD, nbBits); diff --git a/lib/legacy/zstd_v05.c b/lib/legacy/zstd_v05.c index fbed0a015..216c67d01 100644 --- a/lib/legacy/zstd_v05.c +++ b/lib/legacy/zstd_v05.c @@ -826,7 +826,7 @@ MEM_STATIC size_t BITv05_lookBits(BITv05_DStream_t* bitD, U32 nbBits) } /*! BITv05_lookBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv05_lookBitsFast(BITv05_DStream_t* bitD, U32 nbBits) { const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -846,7 +846,7 @@ MEM_STATIC size_t BITv05_readBits(BITv05_DStream_t* bitD, unsigned nbBits) } /*!BITv05_readBitsFast : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv05_readBitsFast(BITv05_DStream_t* bitD, unsigned nbBits) { size_t value = BITv05_lookBitsFast(bitD, nbBits); diff --git a/lib/legacy/zstd_v06.c b/lib/legacy/zstd_v06.c index c486ed0ac..b224355d4 100644 --- a/lib/legacy/zstd_v06.c +++ b/lib/legacy/zstd_v06.c @@ -928,7 +928,7 @@ MEM_STATIC size_t BITv06_initDStream(BITv06_DStream_t* bitD, const void* srcBuff } /*! BITv06_lookBitsFast() : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv06_lookBitsFast(const BITv06_DStream_t* bitD, U32 nbBits) { U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -948,7 +948,7 @@ MEM_STATIC size_t BITv06_readBits(BITv06_DStream_t* bitD, U32 nbBits) } /*! BITv06_readBitsFast() : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, U32 nbBits) { size_t const value = BITv06_lookBitsFast(bitD, nbBits); diff --git a/lib/legacy/zstd_v07.c b/lib/legacy/zstd_v07.c index 20d97da5d..c12a091cb 100644 --- a/lib/legacy/zstd_v07.c +++ b/lib/legacy/zstd_v07.c @@ -596,7 +596,7 @@ MEM_STATIC size_t BITv07_initDStream(BITv07_DStream_t* bitD, const void* srcBuff } /*! BITv07_lookBitsFast() : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv07_lookBitsFast(const BITv07_DStream_t* bitD, U32 nbBits) { U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1; @@ -616,7 +616,7 @@ MEM_STATIC size_t BITv07_readBits(BITv07_DStream_t* bitD, U32 nbBits) } /*! BITv07_readBitsFast() : -* unsafe version; only works only if nbBits >= 1 */ +* unsafe version; only works if nbBits >= 1 */ MEM_STATIC size_t BITv07_readBitsFast(BITv07_DStream_t* bitD, U32 nbBits) { size_t const value = BITv07_lookBitsFast(bitD, nbBits); diff --git a/lib/zdict.h b/lib/zdict.h index f1e139a40..8e21ba0f7 100644 --- a/lib/zdict.h +++ b/lib/zdict.h @@ -110,8 +110,8 @@ extern "C" { * The zstd CLI defaults to a 110KB dictionary. You likely don't need a * dictionary larger than that. But, most use cases can get away with a * smaller dictionary. The advanced dictionary builders can automatically - * shrink the dictionary for you, and select a the smallest size that - * doesn't hurt compression ratio too much. See the `shrinkDict` parameter. + * shrink the dictionary for you, and select the smallest size that doesn't + * hurt compression ratio too much. See the `shrinkDict` parameter. * A smaller dictionary can save memory, and potentially speed up * compression. * diff --git a/lib/zstd.h b/lib/zstd.h index cea2699b9..14a78cd93 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -922,7 +922,7 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict); * If @return == 0, the dictID could not be decoded. * This could for one of the following reasons : * - The frame does not require a dictionary to be decoded (most common case). - * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information. + * - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information. * Note : this use case also happens when using a non-conformant dictionary. * - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`). * - This is not a Zstandard frame. @@ -1409,7 +1409,7 @@ ZSTD_generateSequences( ZSTD_CCtx* zc, ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize); /*! ZSTD_compressSequences() : - * Compress an array of ZSTD_Sequence, associted with @src buffer, into dst. + * Compress an array of ZSTD_Sequence, associated with @src buffer, into dst. * @src contains the entire input (not just the literals). * If @srcSize > sum(sequence.length), the remaining bytes are considered all literals * If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.) @@ -1904,7 +1904,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo * Without validation, providing a sequence that does not conform to the zstd spec will cause * undefined behavior, and may produce a corrupted block. * - * With validation enabled, a if sequence is invalid (see doc/zstd_compression_format.md for + * With validation enabled, if sequence is invalid (see doc/zstd_compression_format.md for * specifics regarding offset/matchlength requirements) then the function will bail out and * return an error. * @@ -2110,7 +2110,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParamete * in the range [dst, dst + pos) MUST not be modified during decompression * or you will get data corruption. * - * When this flags is enabled zstd won't allocate an output buffer, because + * When this flag is enabled zstd won't allocate an output buffer, because * it can write directly to the ZSTD_outBuffer, but it will still allocate * an input buffer large enough to fit any compressed block. This will also * avoid the memcpy() from the internal output buffer to the ZSTD_outBuffer. diff --git a/programs/benchfn.h b/programs/benchfn.h index 590f292ea..99d13ac47 100644 --- a/programs/benchfn.h +++ b/programs/benchfn.h @@ -123,7 +123,7 @@ BMK_runTime_t BMK_extract_runTime(BMK_runOutcome_t outcome); /* when benchmark failed, it means one invocation of `benchFn` failed. * The failure was detected by `errorFn`, operating on return values of `benchFn`. * Returns the faulty return value. - * note : this function will abort() program execution if benchmark did not failed. + * note : this function will abort() program execution if benchmark did not fail. * always check if benchmark failed first ! */ size_t BMK_extract_errorResult(BMK_runOutcome_t outcome); diff --git a/programs/fileio.c b/programs/fileio.c index e37921ada..3c47e3f5b 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -885,8 +885,8 @@ static void FIO_adjustParamsForPatchFromMode(FIO_prefs_t* const prefs, if (cParams.strategy >= ZSTD_btopt) { DISPLAYLEVEL(1, "[Optimal parser notes] Consider the following to improve patch size at the cost of speed:\n"); DISPLAYLEVEL(1, "- Use --single-thread mode in the zstd cli\n"); - DISPLAYLEVEL(1, "- Set a larger targetLength (eg. --zstd=targetLength=4096)\n"); - DISPLAYLEVEL(1, "- Set a larger chainLog (eg. --zstd=chainLog=%u)\n", ZSTD_CHAINLOG_MAX); + DISPLAYLEVEL(1, "- Set a larger targetLength (e.g. --zstd=targetLength=4096)\n"); + DISPLAYLEVEL(1, "- Set a larger chainLog (e.g. --zstd=chainLog=%u)\n", ZSTD_CHAINLOG_MAX); DISPLAYLEVEL(1, "Also consider playing around with searchLog and hashLog\n"); } } diff --git a/programs/util.c b/programs/util.c index 55bcff25a..f53eb03fb 100644 --- a/programs/util.c +++ b/programs/util.c @@ -999,7 +999,7 @@ makeUniqueMirroredDestDirs(char** srcDirNames, unsigned nbFile, const char* outD trimPath(currDirName))) uniqueDirNr++; - /* we need maintain original src dir name instead of trimmed + /* we need to maintain original src dir name instead of trimmed * dir, so we can retrieve the original src dir's mode_t */ uniqueDirNames[uniqueDirNr - 1] = currDirName; } diff --git a/programs/zstd.1 b/programs/zstd.1 index 0e6e016e9..8191e35e7 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -210,7 +210,7 @@ If input directory contains "\.\.", the files in this directory will be ignored\ \fB\-\-no\-progress\fR: do not display the progress bar, but keep all other messages\. . .IP "\(bu" 4 -\fB\-\-show\-default\-cparams\fR: Shows the default compression parameters that will be used for a particular src file\. If the provided src file is not a regular file (eg\. named pipe), the cli will just output the default parameters\. That is, the parameters that are used when the src size is unknown\. +\fB\-\-show\-default\-cparams\fR: Shows the default compression parameters that will be used for a particular src file\. If the provided src file is not a regular file (e\.g\. named pipe), the cli will just output the default parameters\. That is, the parameters that are used when the src size is unknown\. . .IP "\(bu" 4 \fB\-\-\fR: All arguments after \fB\-\-\fR are treated as files @@ -392,7 +392,7 @@ Note: If \fBwindowLog\fR is set to larger than 27, \fB\-\-long=windowLog\fR or \ Specify the maximum number of bits for a hash table\. . .IP -Bigger hash tables cause less collisions which usually makes compression faster, but requires more memory during compression\. +Bigger hash tables cause fewer collisions which usually makes compression faster, but requires more memory during compression\. . .IP The minimum \fIhlog\fR is 6 (64 B) and the maximum is 30 (1 GiB)\. diff --git a/programs/zstd.1.md b/programs/zstd.1.md index 569ca1aa0..10f1bda10 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -159,11 +159,11 @@ the last one takes effect. Note: `--long` mode will be automatically activated if chainLog < fileLog (fileLog being the windowLog required to cover the whole file). You can also manually force it. - Node: for all levels, you can use --patch-from in --single-thread mode - to improve compression ratio at the cost of speed + Node: for all levels, you can use --patch-from in --single-thread mode + to improve compression ratio at the cost of speed Note: for level 19, you can get increased compression ratio at the cost of speed by specifying `--zstd=targetLength=` to be something large - (i.e 4096), and by setting a large `--zstd=chainLog=` + (i.e. 4096), and by setting a large `--zstd=chainLog=` * `--rsyncable` : `zstd` will periodically synchronize the compression state to make the compressed file more rsync-friendly. There is a negligible impact to @@ -185,7 +185,7 @@ the last one takes effect. * `-M#`, `--memory=#`: Set a memory usage limit. By default, Zstandard uses 128 MB for decompression as the maximum amount of memory the decompressor is allowed to use, but you can - override this manually if need be in either direction (ie. you can increase or + override this manually if need be in either direction (i.e. you can increase or decrease it). This is also used during compression when using with --patch-from=. In this case, @@ -275,7 +275,7 @@ the last one takes effect. * `--show-default-cparams`: Shows the default compression parameters that will be used for a particular src file. If the provided src file is not a regular file - (eg. named pipe), the cli will just output the default parameters. + (e.g. named pipe), the cli will just output the default parameters. That is, the parameters that are used when the src size is unknown. * `--`: All arguments after `--` are treated as files @@ -493,7 +493,7 @@ The list of available _options_: - `hashLog`=_hlog_, `hlog`=_hlog_: Specify the maximum number of bits for a hash table. - Bigger hash tables cause less collisions which usually makes compression + Bigger hash tables cause fewer collisions which usually makes compression faster, but requires more memory during compression. The minimum _hlog_ is 6 (64 B) and the maximum is 30 (1 GiB). diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 0b9b82a98..f931b2f38 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -1423,7 +1423,7 @@ int main(int argCount, const char* argv[]) if (showDefaultCParams) { if (operation == zom_decompress) { - DISPLAY("error : can't use --show-default-cparams in decomrpession mode \n"); + DISPLAY("error : can't use --show-default-cparams in decompression mode \n"); CLEAN_RETURN(1); } } diff --git a/tests/README.md b/tests/README.md index c6ffb4095..2cf0e76c2 100644 --- a/tests/README.md +++ b/tests/README.md @@ -45,7 +45,7 @@ optional arguments: -h, --help show this help message and exit --directory DIRECTORY directory with files to benchmark - --levels LEVELS levels to test eg ('1,2,3') + --levels LEVELS levels to test e.g. ('1,2,3') --iterations ITERATIONS number of benchmark iterations to run --emails EMAILS email addresses of people who will be alerted upon @@ -70,7 +70,7 @@ After `sleepTime` (an optional parameter, default 300 seconds) seconds the scrip If a new commit is found it is compiled and a speed benchmark for this commit is performed. The results of the speed benchmark are compared to the previous results. If compression or decompression speed for one of zstd levels is lower than `lowerLimit` (an optional parameter, default 0.98) the speed benchmark is restarted. -If second results are also lower than `lowerLimit` the warning e-mail is send to recipients from the list (the `emails` parameter). +If second results are also lower than `lowerLimit` the warning e-mail is sent to recipients from the list (the `emails` parameter). Additional remarks: - To be sure that speed results are accurate the script should be run on a "stable" target system with no other jobs running in parallel @@ -168,7 +168,7 @@ Full list of arguments can use all --zstd parameter names and 'cParams' as a shorthand for all parameters used in ZSTD_compressionParameters (Default: display all params available) -P# : generated sample compressibility (when no file is provided) - -t# : Caps runtime of operation in seconds (default : 99999 seconds (about 27 hours )) + -t# : Caps runtime of operation in seconds (default: 99999 seconds (about 27 hours)) -v : Prints Benchmarking output -D : Next argument dictionary file -s : Benchmark all files separately diff --git a/tests/automated_benchmarking.py b/tests/automated_benchmarking.py index e0c03ec2d..c98391193 100644 --- a/tests/automated_benchmarking.py +++ b/tests/automated_benchmarking.py @@ -291,7 +291,7 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--directory", help="directory with files to benchmark", default="golden-compression") - parser.add_argument("--levels", help="levels to test eg ('1,2,3')", default="1") + parser.add_argument("--levels", help="levels to test e.g. ('1,2,3')", default="1") parser.add_argument("--iterations", help="number of benchmark iterations to run", default="1") parser.add_argument("--emails", help="email addresses of people who will be alerted upon regression. Only for continuous mode", default=None) parser.add_argument("--frequency", help="specifies the number of seconds to wait before each successive check for new PRs in continuous mode", default=DEFAULT_MAX_API_CALL_FREQUENCY_SEC) diff --git a/tests/fuzz/fuzz.py b/tests/fuzz/fuzz.py index 0c56cccb2..17eac4f6f 100755 --- a/tests/fuzz/fuzz.py +++ b/tests/fuzz/fuzz.py @@ -636,7 +636,7 @@ def regression(args): try: description = """ Runs one or more regression tests. - The fuzzer should have been built with with + The fuzzer should have been built with LIB_FUZZING_ENGINE='libregression.a'. Takes input from CORPORA. """ diff --git a/tests/fuzz/sequence_compression_api.c b/tests/fuzz/sequence_compression_api.c index e01daacaa..4a09d27fb 100644 --- a/tests/fuzz/sequence_compression_api.c +++ b/tests/fuzz/sequence_compression_api.c @@ -294,7 +294,7 @@ int LLVMFuzzerTestOneInput(const uint8_t* src, size_t size) FUZZ_ASSERT(dictBuffer); dictBuffer = generatePseudoRandomString(dictBuffer, dictSize); } - /* Generate window log first so we dont generate offsets too large */ + /* Generate window log first so we don't generate offsets too large */ wLog = FUZZ_dataProducer_uint32Range(producer, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX_32); cLevel = FUZZ_dataProducer_int32Range(producer, -3, 22); mode = (ZSTD_sequenceFormat_e)FUZZ_dataProducer_int32Range(producer, 0, 1); diff --git a/tests/fuzz/simple_compress.c b/tests/fuzz/simple_compress.c index 3716d0d0f..8e6980b35 100644 --- a/tests/fuzz/simple_compress.c +++ b/tests/fuzz/simple_compress.c @@ -9,7 +9,7 @@ */ /** - * This fuzz target attempts to comprss the fuzzed data with the simple + * This fuzz target attempts to compress the fuzzed data with the simple * compression function with an output buffer that may be too small to * ensure that the compressor never crashes. */ diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 018da622c..71356d53d 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -1063,7 +1063,7 @@ static int basicUnitTests(U32 const seed, double compressibility) void* recon = (void*)malloc(size); size_t refPrefixCompressedSize = 0; - size_t refPrefixLdmComrpessedSize = 0; + size_t refPrefixLdmCompressedSize = 0; size_t reconSize = 0; ZSTD_CCtx* const cctx = ZSTD_createCCtx(); @@ -1093,20 +1093,20 @@ static int basicUnitTests(U32 const seed, double compressibility) /* compress on level 1 using refPrefix and ldm */ ZSTD_CCtx_refPrefix(cctx, dict, size);; CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, 1)) - refPrefixLdmComrpessedSize = ZSTD_compress2(cctx, dst, dstSize, src, size); - assert(!ZSTD_isError(refPrefixLdmComrpessedSize)); + refPrefixLdmCompressedSize = ZSTD_compress2(cctx, dst, dstSize, src, size); + assert(!ZSTD_isError(refPrefixLdmCompressedSize)); /* test round trip refPrefix + ldm*/ ZSTD_DCtx_refPrefix(dctx, dict, size); - reconSize = ZSTD_decompressDCtx(dctx, recon, size, dst, refPrefixLdmComrpessedSize); + reconSize = ZSTD_decompressDCtx(dctx, recon, size, dst, refPrefixLdmCompressedSize); assert(!ZSTD_isError(reconSize)); assert(reconSize == size); assert(!memcmp(recon, src, size)); /* make sure that refPrefixCompressedSize is significantly greater */ - assert(refPrefixCompressedSize > 10 * refPrefixLdmComrpessedSize); - /* make sure the ldm comrpessed size is less than 1% of original */ - assert((double)refPrefixLdmComrpessedSize / (double)size < 0.01); + assert(refPrefixCompressedSize > 10 * refPrefixLdmCompressedSize); + /* make sure the ldm compressed size is less than 1% of original */ + assert((double)refPrefixLdmCompressedSize / (double)size < 0.01); ZSTD_freeDCtx(dctx); ZSTD_freeCCtx(cctx); diff --git a/tests/paramgrill.c b/tests/paramgrill.c index 033a10181..756a43340 100644 --- a/tests/paramgrill.c +++ b/tests/paramgrill.c @@ -555,7 +555,7 @@ static int feasible(const BMK_benchResult_t results, const constraint_t target) } /* hill climbing value for part 1 */ -/* Scoring here is a linear reward for all set constraints normalized between 0 to 1 +/* Scoring here is a linear reward for all set constraints normalized between 0 and 1 * (with 0 at 0 and 1 being fully fulfilling the constraint), summed with a logarithmic * bonus to exceeding the constraint value. We also give linear ratio for compression ratio. * The constant factors are experimental. diff --git a/zlibWrapper/README.md b/zlibWrapper/README.md index e61767c46..f1cc88c52 100644 --- a/zlibWrapper/README.md +++ b/zlibWrapper/README.md @@ -43,7 +43,7 @@ This behavior can be changed using `ZWRAP_setDecompressionType(ZWRAP_FORCE_ZLIB) #### Example -We have take the file `test/example.c` from [the zlib library distribution](http://zlib.net/) and copied it to [zlibWrapper/examples/example.c](examples/example.c). +We have taken the file `test/example.c` from [the zlib library distribution](http://zlib.net/) and copied it to [zlibWrapper/examples/example.c](examples/example.c). After compilation and execution it shows the following results: ``` zlib version 1.2.8 = 0x1280, compile flags = 0x65 From 3a64aa29a641f861c94387da209715a641f26447 Mon Sep 17 00:00:00 2001 From: Dominique Pelle Date: Sun, 13 Mar 2022 00:08:55 +0100 Subject: [PATCH 112/472] On more mistake (Node -> Note) --- programs/zstd.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/zstd.1.md b/programs/zstd.1.md index 10f1bda10..6b8117b89 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -159,7 +159,7 @@ the last one takes effect. Note: `--long` mode will be automatically activated if chainLog < fileLog (fileLog being the windowLog required to cover the whole file). You can also manually force it. - Node: for all levels, you can use --patch-from in --single-thread mode + Note: for all levels, you can use --patch-from in --single-thread mode to improve compression ratio at the cost of speed Note: for level 19, you can get increased compression ratio at the cost of speed by specifying `--zstd=targetLength=` to be something large From 64efba4c5ee1e8c9afe92873f79424c9955b82ba Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 17 Mar 2022 09:35:11 -0700 Subject: [PATCH 113/472] Software pipeline for ZSTD_compressBlock_fast_dictMatchState (#3086) * prefetch dict content inside loop * ip0/ip1 pipeline * add L2_4 prefetch to dms pipeline * Remove L1 prefetch * Remove L2 prefetching * Reduce # of gotos * Cosmetic fixes * Check final position sometimes * Track step size as in bc768bc * Fix nits --- lib/compress/zstd_fast.c | 162 +++++++++++++++++++++++---------------- 1 file changed, 98 insertions(+), 64 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 62c4c2cea..5da108c62 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -380,7 +380,8 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( U32 const stepSize = cParams->targetLength + !(cParams->targetLength); const BYTE* const base = ms->window.base; const BYTE* const istart = (const BYTE*)src; - const BYTE* ip = istart; + const BYTE* ip0 = istart; + const BYTE* ip1 = ip0 + stepSize; /* we assert below that stepSize >= 1 */ const BYTE* anchor = istart; const U32 prefixStartIndex = ms->window.dictLimit; const BYTE* const prefixStart = base + prefixStartIndex; @@ -397,13 +398,13 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( const BYTE* const dictStart = dictBase + dictStartIndex; const BYTE* const dictEnd = dms->window.nextSrc; const U32 dictIndexDelta = prefixStartIndex - (U32)(dictEnd - dictBase); - const U32 dictAndPrefixLength = (U32)(ip - prefixStart + dictEnd - dictStart); + const U32 dictAndPrefixLength = (U32)(istart - prefixStart + dictEnd - dictStart); const U32 dictHLog = dictCParams->hashLog; /* if a dictionary is still attached, it necessarily means that * it is within window size. So we just check it. */ const U32 maxDistance = 1U << cParams->windowLog; - const U32 endIndex = (U32)((size_t)(ip - base) + srcSize); + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); assert(endIndex - prefixStartIndex <= maxDistance); (void)maxDistance; (void)endIndex; /* these variables are not used when assert() is disabled */ @@ -415,101 +416,134 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( /* init */ DEBUGLOG(5, "ZSTD_compressBlock_fast_dictMatchState_generic"); - ip += (dictAndPrefixLength == 0); + ip0 += (dictAndPrefixLength == 0); /* dictMatchState repCode checks don't currently handle repCode == 0 * disabling. */ assert(offset_1 <= dictAndPrefixLength); assert(offset_2 <= dictAndPrefixLength); - /* Main Search Loop */ - while (ip < ilimit) { /* < instead of <=, because repcode check at (ip+1) */ + /* Outer search loop */ + assert(stepSize >= 1); + while (ip1 <= ilimit) { /* repcode check at (ip0 + 1) is safe because ip0 < ip1 */ size_t mLength; - size_t const h = ZSTD_hashPtr(ip, hlog, mls); - U32 const curr = (U32)(ip-base); - U32 const matchIndex = hashTable[h]; - const BYTE* match = base + matchIndex; - const U32 repIndex = curr + 1 - offset_1; - const BYTE* repMatch = (repIndex < prefixStartIndex) ? - dictBase + (repIndex - dictIndexDelta) : - base + repIndex; - hashTable[h] = curr; /* update hash table */ + size_t hash0 = ZSTD_hashPtr(ip0, hlog, mls); + const size_t dictHash0 = ZSTD_hashPtr(ip0, dictHLog, mls); + U32 dictMatchIndex = dictHashTable[dictHash0]; + U32 matchIndex = hashTable[hash0]; + U32 curr = (U32)(ip0 - base); + size_t step = stepSize; + const size_t kStepIncr = 1 << kSearchStrength; + const BYTE* nextStep = ip0 + kStepIncr; - if ( ((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow : ensure repIndex isn't overlapping dict + prefix */ - && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { - const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; - mLength = ZSTD_count_2segments(ip+1+4, repMatch+4, iend, repMatchEnd, prefixStart) + 4; - ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); - } else if ( (matchIndex <= prefixStartIndex) ) { - size_t const dictHash = ZSTD_hashPtr(ip, dictHLog, mls); - U32 const dictMatchIndex = dictHashTable[dictHash]; - const BYTE* dictMatch = dictBase + dictMatchIndex; - if (dictMatchIndex <= dictStartIndex || - MEM_read32(dictMatch) != MEM_read32(ip)) { - assert(stepSize >= 1); - ip += ((ip-anchor) >> kSearchStrength) + stepSize; - continue; - } else { - /* found a dict match */ - U32 const offset = (U32)(curr-dictMatchIndex-dictIndexDelta); - mLength = ZSTD_count_2segments(ip+4, dictMatch+4, iend, dictEnd, prefixStart) + 4; - while (((ip>anchor) & (dictMatch>dictStart)) - && (ip[-1] == dictMatch[-1])) { - ip--; dictMatch--; mLength++; + /* Inner search loop */ + while (1) { + const BYTE* match = base + matchIndex; + const U32 repIndex = curr + 1 - offset_1; + const BYTE* repMatch = (repIndex < prefixStartIndex) ? + dictBase + (repIndex - dictIndexDelta) : + base + repIndex; + const size_t hash1 = ZSTD_hashPtr(ip1, hlog, mls); + const size_t dictHash1 = ZSTD_hashPtr(ip1, dictHLog, mls); + hashTable[hash0] = curr; /* update hash table */ + + if (((U32) ((prefixStartIndex - 1) - repIndex) >= + 3) /* intentional underflow : ensure repIndex isn't overlapping dict + prefix */ + && (MEM_read32(repMatch) == MEM_read32(ip0 + 1))) { + const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; + mLength = ZSTD_count_2segments(ip0 + 1 + 4, repMatch + 4, iend, repMatchEnd, prefixStart) + 4; + ip0++; + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); + break; + } else if (matchIndex <= prefixStartIndex) { + /* We only look for a dict match if the normal matchIndex is invalid */ + const BYTE* dictMatch = dictBase + dictMatchIndex; + if (dictMatchIndex > dictStartIndex && + MEM_read32(dictMatch) == MEM_read32(ip0)) { + /* found a dict match */ + U32 const offset = (U32) (curr - dictMatchIndex - dictIndexDelta); + mLength = ZSTD_count_2segments(ip0 + 4, dictMatch + 4, iend, dictEnd, prefixStart) + 4; + while (((ip0 > anchor) & (dictMatch > dictStart)) + && (ip0[-1] == dictMatch[-1])) { + ip0--; + dictMatch--; + mLength++; + } /* catch up */ + offset_2 = offset_1; + offset_1 = offset; + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + break; + } + } else if (MEM_read32(match) == MEM_read32(ip0)) { + /* found a regular match */ + U32 const offset = (U32) (ip0 - match); + mLength = ZSTD_count(ip0 + 4, match + 4, iend) + 4; + while (((ip0 > anchor) & (match > prefixStart)) + && (ip0[-1] == match[-1])) { + ip0--; + match--; + mLength++; } /* catch up */ offset_2 = offset_1; offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + break; } - } else if (MEM_read32(match) != MEM_read32(ip)) { - /* it's not a match, and we're not going to check the dictionary */ - assert(stepSize >= 1); - ip += ((ip-anchor) >> kSearchStrength) + stepSize; - continue; - } else { - /* found a regular match */ - U32 const offset = (U32)(ip-match); - mLength = ZSTD_count(ip+4, match+4, iend) + 4; - while (((ip>anchor) & (match>prefixStart)) - && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ - offset_2 = offset_1; - offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); - } + + /* Prepare for next iteration */ + dictMatchIndex = dictHashTable[dictHash1]; + matchIndex = hashTable[hash1]; + + if (ip1 >= nextStep) { + step++; + nextStep += kStepIncr; + } + ip0 = ip1; + ip1 = ip1 + step; + if (ip1 > ilimit) goto _cleanup; + + curr = (U32)(ip0 - base); + hash0 = hash1; + } /* end inner search loop */ /* match found */ - ip += mLength; - anchor = ip; + assert(mLength); + ip0 += mLength; + anchor = ip0; - if (ip <= ilimit) { + if (ip0 <= ilimit) { /* Fill Table */ assert(base+curr+2 > istart); /* check base overflow */ hashTable[ZSTD_hashPtr(base+curr+2, hlog, mls)] = curr+2; /* here because curr+2 could be > iend-8 */ - hashTable[ZSTD_hashPtr(ip-2, hlog, mls)] = (U32)(ip-2-base); + hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); /* check immediate repcode */ - while (ip <= ilimit) { - U32 const current2 = (U32)(ip-base); + while (ip0 <= ilimit) { + U32 const current2 = (U32)(ip0-base); U32 const repIndex2 = current2 - offset_2; const BYTE* repMatch2 = repIndex2 < prefixStartIndex ? dictBase - dictIndexDelta + repIndex2 : base + repIndex2; if ( ((U32)((prefixStartIndex-1) - (U32)repIndex2) >= 3 /* intentional overflow */) - && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { + && (MEM_read32(repMatch2) == MEM_read32(ip0))) { const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; - size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; + size_t const repLength2 = ZSTD_count_2segments(ip0+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; U32 tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; /* swap offset_2 <=> offset_1 */ ZSTD_storeSeq(seqStore, 0, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); - hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2; - ip += repLength2; - anchor = ip; + hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = current2; + ip0 += repLength2; + anchor = ip0; continue; } break; } } + + /* Prepare for next iteration */ + assert(ip0 == anchor); + ip1 = ip0 + stepSize; } +_cleanup: /* save reps for next block */ rep[0] = offset_1 ? offset_1 : offsetSaved; rep[1] = offset_2 ? offset_2 : offsetSaved; From 7fbe60d577802394137201b689263e8aa9a62080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dirk=20M=C3=BCller?= Date: Thu, 10 Mar 2022 01:34:12 +0100 Subject: [PATCH 114/472] Split help in long and short version, cleanup formatting Adopt the more standard Usage: formatting style List short and long options alongside where available Print lists as a table Use command style description --- programs/zstdcli.c | 175 +++++++++++----------- tests/cli-tests/basic/help.sh.stdout.glob | 40 ++--- 2 files changed, 100 insertions(+), 115 deletions(-) diff --git a/programs/zstdcli.c b/programs/zstdcli.c index a96210ecc..5586f3956 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -143,155 +143,150 @@ static int exeNameMatch(const char* exeName, const char* test) */ static void usage(FILE* f, const char* programName) { - DISPLAY_F(f, "Usage : \n"); - DISPLAY_F(f, " %s [args] [FILE(s)] [-o file] \n", programName); - DISPLAY_F(f, "\n"); - DISPLAY_F(f, "FILE : a filename \n"); - DISPLAY_F(f, " with no FILE, or when FILE is - , read standard input\n"); - DISPLAY_F(f, "Arguments : \n"); + DISPLAY_F(f, "Usage: %s [OPTION]... [FILE]... [-o file]\n", programName); + DISPLAY_F(f, "Compress or uncompress FILEs (with no FILE or when FILE is `-`, read from standard input).\n\n"); + DISPLAY_F(f, " -o file result stored into `file` (only 1 output file)\n"); #ifndef ZSTD_NOCOMPRESS - DISPLAY_F(f, " -# : # compression level (1-%d, default: %d) \n", ZSTDCLI_CLEVEL_MAX, ZSTDCLI_CLEVEL_DEFAULT); + DISPLAY_F(f, " -1 .. -%d compression level (faster .. better; default: %d)\n", ZSTDCLI_CLEVEL_MAX, ZSTDCLI_CLEVEL_DEFAULT); #endif #ifndef ZSTD_NODECOMPRESS - DISPLAY_F(f, " -d : decompression \n"); + DISPLAY_F(f, " -d, --decompress decompression\n"); #endif - DISPLAY_F(f, " -D DICT: use DICT as Dictionary for compression or decompression \n"); - DISPLAY_F(f, " -o file: result stored into `file` (only 1 output file) \n"); - DISPLAY_F(f, " -f : disable input and output checks. Allows overwriting existing files,\n"); - DISPLAY_F(f, " input from console, output to stdout, operating on links,\n"); - DISPLAY_F(f, " block devices, etc.\n"); - DISPLAY_F(f, "--rm : remove source file(s) after successful de/compression \n"); - DISPLAY_F(f, " -k : preserve source file(s) (default) \n"); + DISPLAY_F(f, " -f, --force disable input and output checks. Allows overwriting existing files,\n"); + DISPLAY_F(f, " input from console, output to stdout, operating on links,\n"); + DISPLAY_F(f, " block devices, etc.\n"); + DISPLAY_F(f, " --rm remove source file(s) after successful de/compression\n"); + DISPLAY_F(f, " -k, --keep preserve source file(s) (default) \n"); #ifdef ZSTD_GZCOMPRESS if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ - DISPLAY_F(f, " -n : do not store original filename when compressing \n"); + DISPLAY_F(f, " -n, --no-name do not store original filename when compressing\n"); } #endif - DISPLAY_F(f, " -h/-H : display help/long help and exit \n"); + DISPLAY_F(f, " -D DICT use DICT as Dictionary for compression or decompression\n"); + DISPLAY_F(f, " -h display usage and exit\n"); + DISPLAY_F(f, " -H,--help display long help and exit\n"); + DISPLAY_F(f, "\n"); } static void usage_advanced(const char* programName) { DISPLAYOUT(WELCOME_MESSAGE); usage(stdout, programName); - DISPLAYOUT( "\n"); - DISPLAYOUT( "Advanced arguments : \n"); - DISPLAYOUT( " -V : display Version number and exit \n"); + DISPLAYOUT("Advanced options :\n"); + DISPLAYOUT(" -V, --version display Version number and exit\n"); - DISPLAYOUT( " -c : write to standard output (even if it is the console), keep original file \n"); + DISPLAYOUT(" -c, --stdout write to standard output (even if it is the console), keep original file\n"); - DISPLAYOUT( " -v : verbose mode; specify multiple times to increase verbosity \n"); - DISPLAYOUT( " -q : suppress warnings; specify twice to suppress errors too \n"); - DISPLAYOUT( "--[no-]progress : forcibly display, or never display the progress counter.\n"); - DISPLAYOUT( " note: any (de)compressed output to terminal will mix with progress counter text. \n"); + DISPLAYOUT(" -v, --verbose verbose mode; specify multiple times to increase verbosity\n"); + DISPLAYOUT(" -q, --quiet suppress warnings; specify twice to suppress errors too\n"); + DISPLAYOUT(" --[no-]progress forcibly display, or never display the progress counter\n"); + DISPLAYOUT(" note: any (de)compressed output to terminal will mix with progress counter text\n"); #ifdef UTIL_HAS_CREATEFILELIST - DISPLAYOUT( " -r : operate recursively on directories \n"); - DISPLAYOUT( "--filelist FILE : read list of files to operate upon from FILE \n"); - DISPLAYOUT( "--output-dir-flat DIR : processed files are stored into DIR \n"); + DISPLAYOUT(" -r operate recursively on directories\n"); + DISPLAYOUT(" --filelist FILE read list of files to operate upon from FILE\n"); + DISPLAYOUT(" --output-dir-flat DIR : processed files are stored into DIR\n"); #endif #ifdef UTIL_HAS_MIRRORFILELIST - DISPLAYOUT( "--output-dir-mirror DIR : processed files are stored into DIR respecting original directory structure \n"); + DISPLAYOUT(" --output-dir-mirror DIR : processed files are stored into DIR respecting original directory structure\n"); #endif if (AIO_supported()) - DISPLAYOUT( "--[no-]asyncio : use asynchronous IO (default: enabled) \n"); + DISPLAYOUT(" --[no-]asyncio use asynchronous IO (default: enabled)\n"); #ifndef ZSTD_NOCOMPRESS - DISPLAYOUT( "--[no-]check : during compression, add XXH64 integrity checksum to frame (default: enabled)"); + DISPLAYOUT(" --[no-]check during compression, add XXH64 integrity checksum to frame (default: enabled)\n"); #ifndef ZSTD_NODECOMPRESS - DISPLAYOUT( ". If specified with -d, decompressor will ignore/validate checksums in compressed frame (default: validate)."); + DISPLAYOUT(" if specified with -d, decompressor will ignore/validate checksums in compressed frame (default: validate)\n"); #endif #else #ifdef ZSTD_NOCOMPRESS - DISPLAYOUT( "--[no-]check : during decompression, ignore/validate checksums in compressed frame (default: validate)."); + DISPLAYOUT(" --[no-]check during decompression, ignore/validate checksums in compressed frame (default: validate)"); #endif + DISPLAYOUT("\n"); #endif /* ZSTD_NOCOMPRESS */ #ifndef ZSTD_NOTRACE - DISPLAYOUT( "\n"); - DISPLAYOUT( "--trace FILE : log tracing information to FILE."); + DISPLAYOUT(" --trace FILE log tracing information to FILE\n"); #endif - DISPLAYOUT( "\n"); - - DISPLAYOUT( "-- : All arguments after \"--\" are treated as files \n"); + DISPLAYOUT(" -- all arguments after \"--\" are treated as files\n"); #ifndef ZSTD_NOCOMPRESS - DISPLAYOUT( "\n"); - DISPLAYOUT( "Advanced compression arguments : \n"); - DISPLAYOUT( "--ultra : enable levels beyond %i, up to %i (requires more memory) \n", ZSTDCLI_CLEVEL_MAX, ZSTD_maxCLevel()); - DISPLAYOUT( "--long[=#]: enable long distance matching with given window log (default: %u) \n", g_defaultMaxWindowLog); - DISPLAYOUT( "--fast[=#]: switch to very fast compression levels (default: %u) \n", 1); + DISPLAYOUT("\n"); + DISPLAYOUT("Advanced compression options :\n"); + DISPLAYOUT(" --ultra enable levels beyond %i, up to %i (requires more memory)\n", ZSTDCLI_CLEVEL_MAX, ZSTD_maxCLevel()); + DISPLAYOUT(" --long[=#] enable long distance matching with given window log (default: %u)\n", g_defaultMaxWindowLog); + DISPLAYOUT(" --fast[=#] switch to very fast compression levels (default: %u)\n", 1); #ifdef ZSTD_GZCOMPRESS if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ - DISPLAYOUT( "--best : compatibility alias for -9 \n"); - DISPLAYOUT( "--no-name : do not store original filename when compressing \n"); + DISPLAYOUT(" --best compatibility alias for -9 \n"); + DISPLAYOUT(" --no-name do not store original filename when compressing\n"); } #endif - DISPLAYOUT( "--adapt : dynamically adapt compression level to I/O conditions \n"); - DISPLAYOUT( "--[no-]row-match-finder : force enable/disable usage of fast row-based matchfinder for greedy, lazy, and lazy2 strategies \n"); - DISPLAYOUT( "--patch-from=FILE : specify the file to be used as a reference point for zstd's diff engine. \n"); + DISPLAYOUT(" --adapt dynamically adapt compression level to I/O conditions\n"); + DISPLAYOUT(" --[no-]row-match-finder : force enable/disable usage of fast row-based matchfinder for greedy, lazy, and lazy2 strategies\n"); + DISPLAYOUT(" --patch-from=FILE : specify the file to be used as a reference point for zstd's diff engine. \n"); # ifdef ZSTD_MULTITHREAD - DISPLAYOUT( " -T# : spawns # compression threads (default: 1, 0==# cores) \n"); - DISPLAYOUT( " -B# : select size of each job (default: 0==automatic) \n"); - DISPLAYOUT( "--single-thread : use a single thread for both I/O and compression (result slightly different than -T1) \n"); - DISPLAYOUT( "--auto-threads={physical,logical} (default: physical} : use either physical cores or logical cores as default when specifying -T0 \n"); - DISPLAYOUT( "--rsyncable : compress using a rsync-friendly method (-B sets block size) \n"); + DISPLAYOUT(" -T# spawn # compression threads (default: 1, 0==# cores) \n"); + DISPLAYOUT(" -B# select size of each job (default: 0==automatic) \n"); + DISPLAYOUT(" --single-thread use a single thread for both I/O and compression (result slightly different than -T1) \n"); + DISPLAYOUT(" --auto-threads={physical,logical} : use either physical cores or logical cores as default when specifying -T0 (default: physical)\n"); + DISPLAYOUT(" --rsyncable compress using a rsync-friendly method (-B sets block size) \n"); # endif - DISPLAYOUT( "--exclude-compressed: only compress files that are not already compressed \n"); - DISPLAYOUT( "--stream-size=# : specify size of streaming input from `stdin` \n"); - DISPLAYOUT( "--size-hint=# optimize compression parameters for streaming input of approximately this size \n"); - DISPLAYOUT( "--target-compressed-block-size=# : generate compressed block of approximately targeted size \n"); - DISPLAYOUT( "--no-dictID : don't write dictID into header (dictionary compression only) \n"); - DISPLAYOUT( "--[no-]compress-literals : force (un)compressed literals \n"); + DISPLAYOUT(" --exclude-compressed : only compress files that are not already compressed \n"); + DISPLAYOUT(" --stream-size=# specify size of streaming input from `stdin` \n"); + DISPLAYOUT(" --size-hint=# optimize compression parameters for streaming input of approximately this size \n"); + DISPLAYOUT(" --target-compressed-block-size=# : generate compressed block of approximately targeted size \n"); + DISPLAYOUT(" --no-dictID don't write dictID into header (dictionary compression only)\n"); + DISPLAYOUT(" --[no-]compress-literals : force (un)compressed literals\n"); - DISPLAYOUT( "--format=zstd : compress files to the .zst format (default) \n"); + DISPLAYOUT(" --format=zstd compress files to the .zst format (default)\n"); #ifdef ZSTD_GZCOMPRESS - DISPLAYOUT( "--format=gzip : compress files to the .gz format \n"); + DISPLAYOUT(" --format=gzip compress files to the .gz format\n"); #endif #ifdef ZSTD_LZMACOMPRESS - DISPLAYOUT( "--format=xz : compress files to the .xz format \n"); - DISPLAYOUT( "--format=lzma : compress files to the .lzma format \n"); + DISPLAYOUT(" --format=xz compress files to the .xz format\n"); + DISPLAYOUT(" --format=lzma compress files to the .lzma format\n"); #endif #ifdef ZSTD_LZ4COMPRESS - DISPLAYOUT( "--format=lz4 : compress files to the .lz4 format \n"); + DISPLAYOUT( " --format=lz4 compress files to the .lz4 format\n"); #endif #endif /* !ZSTD_NOCOMPRESS */ #ifndef ZSTD_NODECOMPRESS - DISPLAYOUT( "\n"); - DISPLAYOUT( "Advanced decompression arguments : \n"); - DISPLAYOUT( " -l : print information about zstd compressed files \n"); - DISPLAYOUT( "--test : test compressed file integrity \n"); - DISPLAYOUT( " -M# : Set a memory usage limit for decompression \n"); + DISPLAYOUT("\n"); + DISPLAYOUT("Advanced decompression options :\n"); + DISPLAYOUT(" -l print information about zstd compressed files\n"); + DISPLAYOUT(" --test test compressed file integrity\n"); + DISPLAYOUT(" -M# Set a memory usage limit for decompression\n"); # if ZSTD_SPARSE_DEFAULT - DISPLAYOUT( "--[no-]sparse : sparse mode (default: enabled on file, disabled on stdout) \n"); + DISPLAYOUT(" --[no-]sparse sparse mode (default: enabled on file, disabled on stdout)\n"); # else - DISPLAYOUT( "--[no-]sparse : sparse mode (default: disabled) \n"); + DISPLAYOUT(" --[no-]sparse sparse mode (default: disabled)\n"); # endif #endif /* ZSTD_NODECOMPRESS */ #ifndef ZSTD_NODICT - DISPLAYOUT( "\n"); - DISPLAYOUT( "Dictionary builder : \n"); - DISPLAYOUT( "--train ## : create a dictionary from a training set of files \n"); - DISPLAYOUT( "--train-cover[=k=#,d=#,steps=#,split=#,shrink[=#]] : use the cover algorithm with optional args \n"); - DISPLAYOUT( "--train-fastcover[=k=#,d=#,f=#,steps=#,split=#,accel=#,shrink[=#]] : use the fast cover algorithm with optional args \n"); - DISPLAYOUT( "--train-legacy[=s=#] : use the legacy algorithm with selectivity (default: %u) \n", g_defaultSelectivityLevel); - DISPLAYOUT( " -o DICT : DICT is dictionary name (default: %s) \n", g_defaultDictName); - DISPLAYOUT( "--maxdict=# : limit dictionary to specified size (default: %u) \n", g_defaultMaxDictSize); - DISPLAYOUT( "--dictID=# : force dictionary ID to specified value (default: random) \n"); + DISPLAYOUT("\n"); + DISPLAYOUT("Dictionary builder :\n"); + DISPLAYOUT(" --train ## create a dictionary from a training set of files\n"); + DISPLAYOUT(" --train-cover[=k=#,d=#,steps=#,split=#,shrink[=#]] : use the cover algorithm with optional args\n"); + DISPLAYOUT(" --train-fastcover[=k=#,d=#,f=#,steps=#,split=#,accel=#,shrink[=#]] : use the fast cover algorithm with optional args\n"); + DISPLAYOUT(" --train-legacy[=s=#] : use the legacy algorithm with selectivity (default: %u)\n", g_defaultSelectivityLevel); + DISPLAYOUT(" -o DICT DICT is dictionary name (default: %s)\n", g_defaultDictName); + DISPLAYOUT(" --maxdict=# limit dictionary to specified size (default: %u)\n", g_defaultMaxDictSize); + DISPLAYOUT(" --dictID=# force dictionary ID to specified value (default: random)\n"); #endif #ifndef ZSTD_NOBENCH - DISPLAYOUT( "\n"); - DISPLAYOUT( "Benchmark arguments : \n"); - DISPLAYOUT( " -b# : benchmark file(s), using # compression level (default: %d) \n", ZSTDCLI_CLEVEL_DEFAULT); - DISPLAYOUT( " -e# : test all compression levels successively from -b# to -e# (default: 1) \n"); - DISPLAYOUT( " -i# : minimum evaluation time in seconds (default: 3s) \n"); - DISPLAYOUT( " -B# : cut file into independent blocks of size # (default: no block) \n"); - DISPLAYOUT( " -S : output one benchmark result per input file (default: consolidated result) \n"); - DISPLAYOUT( "--priority=rt : set process priority to real-time \n"); + DISPLAYOUT("\n"); + DISPLAYOUT("Benchmark options : \n"); + DISPLAYOUT(" -b# benchmark file(s), using # compression level (default: %d)\n", ZSTDCLI_CLEVEL_DEFAULT); + DISPLAYOUT(" -e# test all compression levels successively from -b# to -e# (default: 1)\n"); + DISPLAYOUT(" -i# minimum evaluation time in seconds (default: 3s)\n"); + DISPLAYOUT(" -B# cut file into independent blocks of size # (default: no block)\n"); + DISPLAYOUT(" -S output one benchmark result per input file (default: consolidated result)\n"); + DISPLAYOUT(" --priority=rt set process priority to real-time\n"); #endif } @@ -1099,8 +1094,8 @@ int main(int argCount, const char* argv[]) { /* Display help */ case 'V': printVersion(); CLEAN_RETURN(0); /* Version Only */ - case 'H': - case 'h': usage_advanced(programName); CLEAN_RETURN(0); + case 'H': usage_advanced(programName); CLEAN_RETURN(0); + case 'h': usage(stdout, programName); CLEAN_RETURN(0); /* Compress */ case 'z': operation=zom_compress; argument++; break; diff --git a/tests/cli-tests/basic/help.sh.stdout.glob b/tests/cli-tests/basic/help.sh.stdout.glob index 5b2f8e458..be3f15400 100644 --- a/tests/cli-tests/basic/help.sh.stdout.glob +++ b/tests/cli-tests/basic/help.sh.stdout.glob @@ -1,34 +1,24 @@ + zstd -h -*** zstd command line interface *-bits v1.*.*, by Yann Collet *** -Usage : - zstd *args* *FILE(s)* *-o file* +Usage: zstd *OPTION*... *FILE*... *-o file* +Compress or uncompress FILEs (with no FILE or when FILE is `-`, read from standard input). -FILE : a filename - with no FILE, or when FILE is - , read standard input -Arguments : - -# : # compression level* - -d : decompression - -D DICT: use DICT as Dictionary for compression or decompression - -o file: result stored into `file` (only 1 output file) - -f : disable input and output checks. Allows overwriting existing files, - input from console, output to stdout, operating on links, - block devices, etc. ---rm : remove source file(s) after successful de/compression - -k : preserve source file(s) (default) - -h/-H : display help/long help and exit + -o file result stored into `file` (only 1 output file) + -1 .. -19 compression level (faster .. better; default: 3) + -d, --decompress decompression + -f, --force disable input and output checks. Allows overwriting existing files, + input from console, output to stdout, operating on links, + block devices, etc. + --rm remove source file(s) after successful de/compression + -k, --keep preserve source file(s) (default) + -D DICT use DICT as Dictionary for compression or decompression + -h display usage and exit + -H,--help display long help and exit -Advanced arguments : - -V : display Version number and exit -... + zstd -H ... -Arguments : -... -Advanced arguments : +Advanced options : ... + zstd --help ... -Arguments : -... -Advanced arguments : +Advanced options : ... From 678bfff4fed62b8d1076f7388343338acef2b4c4 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 29 Mar 2022 16:45:09 -0700 Subject: [PATCH 115/472] fix minor bug in sequence_compression_api tester margin was merely slightly too short for extra splitting. --- tests/fuzz/sequence_compression_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fuzz/sequence_compression_api.c b/tests/fuzz/sequence_compression_api.c index 4a09d27fb..cc872a081 100644 --- a/tests/fuzz/sequence_compression_api.c +++ b/tests/fuzz/sequence_compression_api.c @@ -153,7 +153,7 @@ static size_t generateRandomSequences(FUZZ_dataProducer_t* producer, matchLengthMax = MIN(matchLengthMax, blockSizeMax/2); } - while ( nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ-2 /* extra room for explicit delimiters */ + while ( nbSeqGenerated < ZSTD_FUZZ_MAX_NBSEQ - 3 /* extra room for explicit delimiters */ && bytesGenerated < ZSTD_FUZZ_GENERATED_SRC_MAXSIZE && !FUZZ_dataProducer_empty(producer)) { uint32_t matchLength; From 3e6bbdd8473a753d2047969ac0053fb2cb4dda23 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 31 Mar 2022 12:26:20 -0400 Subject: [PATCH 116/472] Disable visual-2015 tests (#3106) --- .github/workflows/dev-short-tests.yml | 33 ++++++++++++++------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index a54796916..9f5150841 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -214,22 +214,23 @@ jobs: msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v142 /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} - visual-2015: - # only GH actions windows-2016 contains VS 2015 - runs-on: windows-2016 - strategy: - matrix: - platform: [x64, Win32] - configuration: [Debug, Release] - steps: - - uses: actions/checkout@v2 - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v1.0.2 - - name: Build - working-directory: ${{env.GITHUB_WORKSPACE}} - run: > - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 - /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} +# TODO: fix as part of https://github.com/facebook/zstd/issues/3064 +# visual-2015: +# # only GH actions windows-2016 contains VS 2015 +# runs-on: windows-2016 +# strategy: +# matrix: +# platform: [x64, Win32] +# configuration: [Debug, Release] +# steps: +# - uses: actions/checkout@v2 +# - name: Add MSBuild to PATH +# uses: microsoft/setup-msbuild@v1.0.2 +# - name: Build +# working-directory: ${{env.GITHUB_WORKSPACE}} +# run: > +# msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 +# /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} minimal-decompressor-macros: runs-on: ubuntu-latest From f133bc8c9c345fac5c28b6758e1f133b8b6280fd Mon Sep 17 00:00:00 2001 From: Paul Menzel Date: Sun, 3 Apr 2022 07:26:49 +0200 Subject: [PATCH 117/472] zstd.1: Remove superfluous *not* in description of `--long[=#]` Resolves: https://github.com/facebook/zstd/issues/3101 --- programs/zstd.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/zstd.1.md b/programs/zstd.1.md index 49554ca11..3901b58db 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -139,7 +139,7 @@ the last one takes effect. _note_ : at the time of this writing, `--adapt` can remain stuck at low speed when combined with multiple worker threads (>=2). * `--long[=#]`: - enables long distance matching with `#` `windowLog`, if not `#` is not + enables long distance matching with `#` `windowLog`, if `#` is not present it defaults to `27`. This increases the window size (`windowLog`) and memory usage for both the compressor and decompressor. From 0df2fd6088a02cfce7305ccd44874fa9d94cbbb3 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 13 Apr 2022 18:51:59 -0700 Subject: [PATCH 118/472] updated man page, providing more details for --train mode following questions from #3111. Note : only the source markdown has been updated, the actual man page zstd.1 still need to be processed. --- programs/zstd.1.md | 98 +++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 35 deletions(-) diff --git a/programs/zstd.1.md b/programs/zstd.1.md index 3901b58db..4e176f399 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -19,8 +19,8 @@ DESCRIPTION with command line syntax similar to `gzip (1)` and `xz (1)`. It is based on the **LZ77** family, with further FSE & huff0 entropy stages. `zstd` offers highly configurable compression speed, -with fast modes at > 200 MB/s per core, -and strong modes nearing lzma compression ratios. +from fast modes at > 200 MB/s per core, +to strong modes with excellent compression ratios. It also features a very fast decoder, with speeds > 500 MB/s per core. `zstd` command line syntax is generally similar to gzip, @@ -31,13 +31,12 @@ but features the following differences : - When compressing a single file, `zstd` displays progress notifications and result summary by default. Use `-q` to turn them off. - - `zstd` does not accept input from console, - but it properly accepts `stdin` when it's not the console. - `zstd` displays a short help page when command line is an error. Use `-q` to turn it off. + - `zstd` does not accept input from console, + though it does accept `stdin` when it's not the console. -`zstd` compresses or decompresses each _file_ according to the selected -operation mode. +`zstd` processes each _file_ according to the selected operation mode. If no _files_ are given or _file_ is `-`, `zstd` reads from standard input and writes the processed data to standard output. `zstd` will refuse to write compressed data to standard output @@ -54,8 +53,8 @@ whose name is derived from the source _file_ name: get the target filename ### Concatenation with .zst files -It is possible to concatenate `.zst` files as is. -`zstd` will decompress such files as if they were a single `.zst` file. +It is possible to concatenate multiple `.zst` files. `zstd` will decompress +such agglomerated file as if it was a single `.zst` file. OPTIONS ------- @@ -85,8 +84,8 @@ the last one takes effect. Decompress. * `-t`, `--test`: Test the integrity of compressed _files_. - This option is equivalent to `--decompress --stdout` except that the - decompressed data is discarded instead of being written to standard output. + This option is equivalent to `--decompress --stdout > /dev/null`, + decompressed data is discarded and checksummed for errors. No files are created or removed. * `-b#`: Benchmark file(s) using compression level # @@ -96,7 +95,7 @@ the last one takes effect. * `-l`, `--list`: Display information related to a zstd compressed file, such as size, ratio, and checksum. Some of these fields may not be available. - This command can be augmented with the `-v` modifier. + This command's output can be augmented with the `-v` modifier. ### Operation modifiers @@ -292,10 +291,10 @@ options that intend to mimic the `gzip` behavior: alias to the option `-9`. -### Restricted usage of Environment Variables +### Interactions with Environment Variables -Using environment variables to set parameters has security implications. -Therefore, this avenue is intentionally restricted. +Employing environment variables to set parameters has security implications. +Therefore, this avenue is intentionally limited. Only `ZSTD_CLEVEL` and `ZSTD_NBTHREADS` are currently supported. They set the compression level and number of threads to use during compression, respectively. @@ -305,8 +304,8 @@ If the value of `ZSTD_CLEVEL` is not a valid integer, it will be ignored with a `ZSTD_NBTHREADS` can be used to set the number of threads `zstd` will attempt to use during compression. If the value of `ZSTD_NBTHREADS` is not a valid unsigned integer, it will be ignored with a warning message. -`ZSTD_NBTHREADS` has a default value of (`1`), and is capped at ZSTDMT_NBWORKERS_MAX==200. `zstd` must be -compiled with multithread support for this to have any effect. +`ZSTD_NBTHREADS` has a default value of (`1`), and is capped at ZSTDMT_NBWORKERS_MAX==200. +`zstd` must be compiled with multithread support for this to have any effect. They can both be overridden by corresponding command line arguments: `-#` for compression level and `-T#` for number of compression threads. @@ -318,27 +317,36 @@ DICTIONARY BUILDER which greatly improves efficiency on small files and messages. It's possible to train `zstd` with a set of samples, the result of which is saved into a file called a `dictionary`. -Then during compression and decompression, reference the same dictionary, +Then, during compression and decompression, reference the same dictionary, using command `-D dictionaryFileName`. Compression of small files similar to the sample set will be greatly improved. * `--train FILEs`: Use FILEs as training set to create a dictionary. - The training set should contain a lot of small files (> 100), + The training set should ideally contain a lot of samples (> 100), and weight typically 100x the target dictionary size - (for example, 10 MB for a 100 KB dictionary). + (for example, ~10 MB for a 100 KB dictionary). `--train` can be combined with `-r` to indicate a directory rather than listing all the files, which can be useful to circumvent shell expansion limits. + Since dictionary compression is mostly effective for small files, + the expectation is that the training set will only contain small files. + In the case where some samples happen to be large, + only the first 128 KB of these samples will be used for training. + `--train` supports multithreading if `zstd` is compiled with threading support (default). - Additional parameters can be specified with `--train-fastcover`. + Additional advanced parameters can be specified with `--train-fastcover`. The legacy dictionary builder can be accessed with `--train-legacy`. The slower cover dictionary builder can be accessed with `--train-cover`. - Default is equivalent to `--train-fastcover=d=8,steps=4`. -* `-o file`: - Dictionary saved into `file` (default name: dictionary). + Default `--train` is equivalent to `--train-fastcover=d=8,steps=4`. + +* `-o FILE`: + Dictionary saved into `FILE` (default name: dictionary). * `--maxdict=#`: - Limit dictionary to specified size (default: 112640). + Limit dictionary to specified size (default: 112640 bytes). + As usual, quantities are expressed in bytes by default, + and it's possible to employ suffixes (like `KB` or `MB`) + to specify larger values. * `-#`: Use `#` compression level during training (optional). Will generate statistics more tuned for selected compression level, @@ -346,17 +354,37 @@ Compression of small files similar to the sample set will be greatly improved. * `-B#`: Split input files into blocks of size # (default: no split) * `-M#`, `--memory=#`: - Limit the amount of sample data loaded for training (default: 2 GB). See above for details. + Limit the amount of sample data loaded for training (default: 2 GB). + Note that the default (2 GB) is also the maximum. + This parameter can be useful in situations where the training set size + is not well controlled and could be potentially very large. + Since speed of the training process is directly correlated to + the size of the training sample set, + a smaller sample set leads to faster training. + + In situations where the training set is larger than maximum memory, + the CLI will randomly select samples among the available ones, + up to the maximum allowed memory budget. + This is meant to improve dictionary relevance + by mitigating the potential impact of clustering, + such as selecting only files from the beginning of a list + sorted by modification date, or sorted by alphabetical order. + The randomization process is deterministic, so + training of the same list of files with the same parameters + will lead to the creation of the same dictionary. + * `--dictID=#`: - A dictionary ID is a locally unique ID - that a decoder can use to verify it is using the right dictionary. + A dictionary ID is a locally unique ID. + The decoder will use this value to verify it is using the right dictionary. By default, zstd will create a 4-bytes random number ID. - It's possible to give a precise number instead. - Short numbers have an advantage : an ID < 256 will only need 1 byte in the - compressed frame header, and an ID < 65536 will only need 2 bytes. - This compares favorably to 4 bytes default. - However, it's up to the dictionary manager to not assign twice the same ID to + It's possible to provide an explicit number ID instead. + It's up to the dictionary manager to not assign twice the same ID to 2 different dictionaries. + Note that short numbers have an advantage : + an ID < 256 will only need 1 byte in the compressed frame header, + and an ID < 65536 will only need 2 bytes. + This compares favorably to 4 bytes default. + * `--train-cover[=k#,d=#,steps=#,split=#,shrink[=#]]`: Select parameters for the default dictionary builder algorithm named cover. If _d_ is not specified, then it tries _d_ = 6 and _d_ = 8. @@ -421,7 +449,7 @@ Compression of small files similar to the sample set will be greatly improved. Use legacy dictionary builder algorithm with the given dictionary _selectivity_ (default: 9). The smaller the _selectivity_ value, the denser the dictionary, - improving its efficiency but reducing its possible maximum size. + improving its efficiency but reducing its achievable maximum size. `--train-legacy=s=#` is also accepted. Examples: @@ -452,14 +480,14 @@ BENCHMARK ADVANCED COMPRESSION OPTIONS ---------------------------- ### -B#: -Select the size of each compression job. +Specify the size of each compression job. This parameter is only available when multi-threading is enabled. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads. Default job size varies depending on compression level (generally `4 * windowSize`). `-B#` makes it possible to manually select a custom size. Note that job size must respect a minimum value which is enforced transparently. This minimum is either 512 KB, or `overlapSize`, whichever is largest. -Different job sizes will lead to (slightly) different compressed frames. +Different job sizes will lead to non-identical compressed frames. ### --zstd[=options]: `zstd` provides 22 predefined compression levels. From eb726c6a20f1c83eee5730ca28a4126432a0bb07 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 13 Apr 2022 18:57:27 -0700 Subject: [PATCH 119/472] updated man pages had to run the conversion script on Ubuntu, as it doesn't run correctly on macos anymore. --- programs/zstd.1 | 301 +++++++++++--------------------------------- programs/zstdgrep.1 | 13 +- programs/zstdless.1 | 9 +- 3 files changed, 77 insertions(+), 246 deletions(-) diff --git a/programs/zstd.1 b/programs/zstd.1 index 78313c7f3..c89060c7d 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -1,512 +1,357 @@ -. -.TH "ZSTD" "1" "February 2022" "zstd 1.5.2" "User Commands" -. +.TH "ZSTD" "1" "April 2022" "zstd 1.5.2" "User Commands" .SH "NAME" \fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files -. .SH "SYNOPSIS" -\fBzstd\fR [\fIOPTIONS\fR] [\-|\fIINPUT\-FILE\fR] [\-o \fIOUTPUT\-FILE\fR] -. +.TS +allbox; +\fBzstd\fR [\fIOPTIONS\fR] [\- \fIINPUT\-FILE\fR] [\-o \fIOUTPUT\-FILE\fR] +.TE .P \fBzstdmt\fR is equivalent to \fBzstd \-T0\fR -. .P \fBunzstd\fR is equivalent to \fBzstd \-d\fR -. .P \fBzstdcat\fR is equivalent to \fBzstd \-dcf\fR -. .SH "DESCRIPTION" -\fBzstd\fR is a fast lossless compression algorithm and data compression tool, with command line syntax similar to \fBgzip (1)\fR and \fBxz (1)\fR\. It is based on the \fBLZ77\fR family, with further FSE & huff0 entropy stages\. \fBzstd\fR offers highly configurable compression speed, with fast modes at > 200 MB/s per core, and strong modes nearing lzma compression ratios\. It also features a very fast decoder, with speeds > 500 MB/s per core\. -. +\fBzstd\fR is a fast lossless compression algorithm and data compression tool, with command line syntax similar to \fBgzip (1)\fR and \fBxz (1)\fR\. It is based on the \fBLZ77\fR family, with further FSE & huff0 entropy stages\. \fBzstd\fR offers highly configurable compression speed, from fast modes at > 200 MB/s per core, to strong modes with excellent compression ratios\. It also features a very fast decoder, with speeds > 500 MB/s per core\. .P \fBzstd\fR command line syntax is generally similar to gzip, but features the following differences : -. -.IP "\(bu" 4 +.IP "\[ci]" 4 Source files are preserved by default\. It\'s possible to remove them automatically by using the \fB\-\-rm\fR command\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 When compressing a single file, \fBzstd\fR displays progress notifications and result summary by default\. Use \fB\-q\fR to turn them off\. -. -.IP "\(bu" 4 -\fBzstd\fR does not accept input from console, but it properly accepts \fBstdin\fR when it\'s not the console\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fBzstd\fR displays a short help page when command line is an error\. Use \fB\-q\fR to turn it off\. -. +.IP "\[ci]" 4 +\fBzstd\fR does not accept input from console, though it does accept \fBstdin\fR when it\'s not the console\. .IP "" 0 -. .P -\fBzstd\fR compresses or decompresses each \fIfile\fR according to the selected operation mode\. If no \fIfiles\fR are given or \fIfile\fR is \fB\-\fR, \fBzstd\fR reads from standard input and writes the processed data to standard output\. \fBzstd\fR will refuse to write compressed data to standard output if it is a terminal : it will display an error message and skip the \fIfile\fR\. Similarly, \fBzstd\fR will refuse to read compressed data from standard input if it is a terminal\. -. +\fBzstd\fR processes each \fIfile\fR according to the selected operation mode\. If no \fIfiles\fR are given or \fIfile\fR is \fB\-\fR, \fBzstd\fR reads from standard input and writes the processed data to standard output\. \fBzstd\fR will refuse to write compressed data to standard output if it is a terminal : it will display an error message and skip the \fIfile\fR\. Similarly, \fBzstd\fR will refuse to read compressed data from standard input if it is a terminal\. .P Unless \fB\-\-stdout\fR or \fB\-o\fR is specified, \fIfiles\fR are written to a new file whose name is derived from the source \fIfile\fR name: -. -.IP "\(bu" 4 +.IP "\[ci]" 4 When compressing, the suffix \fB\.zst\fR is appended to the source filename to get the target filename\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 When decompressing, the \fB\.zst\fR suffix is removed from the source filename to get the target filename -. .IP "" 0 -. .SS "Concatenation with \.zst files" -It is possible to concatenate \fB\.zst\fR files as is\. \fBzstd\fR will decompress such files as if they were a single \fB\.zst\fR file\. -. +It is possible to concatenate multiple \fB\.zst\fR files\. \fBzstd\fR will decompress such agglomerated file as if it was a single \fB\.zst\fR file\. .SH "OPTIONS" -. .SS "Integer suffixes and special values" In most places where an integer argument is expected, an optional suffix is supported to easily indicate large integers\. There must be no space between the integer and the suffix\. -. .TP \fBKiB\fR -Multiply the integer by 1,024 (2^10)\. \fBKi\fR, \fBK\fR, and \fBKB\fR are accepted as synonyms for \fBKiB\fR\. -. +Multiply the integer by 1,024 (2\e^10)\. \fBKi\fR, \fBK\fR, and \fBKB\fR are accepted as synonyms for \fBKiB\fR\. .TP \fBMiB\fR -Multiply the integer by 1,048,576 (2^20)\. \fBMi\fR, \fBM\fR, and \fBMB\fR are accepted as synonyms for \fBMiB\fR\. -. +Multiply the integer by 1,048,576 (2\e^20)\. \fBMi\fR, \fBM\fR, and \fBMB\fR are accepted as synonyms for \fBMiB\fR\. .SS "Operation mode" If multiple operation mode options are given, the last one takes effect\. -. .TP \fB\-z\fR, \fB\-\-compress\fR Compress\. This is the default operation mode when no operation mode option is specified and no other operation mode is implied from the command name (for example, \fBunzstd\fR implies \fB\-\-decompress\fR)\. -. .TP \fB\-d\fR, \fB\-\-decompress\fR, \fB\-\-uncompress\fR Decompress\. -. .TP \fB\-t\fR, \fB\-\-test\fR -Test the integrity of compressed \fIfiles\fR\. This option is equivalent to \fB\-\-decompress \-\-stdout\fR except that the decompressed data is discarded instead of being written to standard output\. No files are created or removed\. -. +Test the integrity of compressed \fIfiles\fR\. This option is equivalent to \fB\-\-decompress \-\-stdout > /dev/null\fR, decompressed data is discarded and checksummed for errors\. No files are created or removed\. .TP \fB\-b#\fR Benchmark file(s) using compression level # -. .TP \fB\-\-train FILEs\fR Use FILEs as a training set to create a dictionary\. The training set should contain a lot of small files (> 100)\. -. .TP \fB\-l\fR, \fB\-\-list\fR -Display information related to a zstd compressed file, such as size, ratio, and checksum\. Some of these fields may not be available\. This command can be augmented with the \fB\-v\fR modifier\. -. +Display information related to a zstd compressed file, such as size, ratio, and checksum\. Some of these fields may not be available\. This command\'s output can be augmented with the \fB\-v\fR modifier\. .SS "Operation modifiers" -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-#\fR: \fB#\fR compression level [1\-19] (default: 3) -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-ultra\fR: unlocks high compression levels 20+ (maximum 22), using a lot more memory\. Note that decompression will also require more memory when using these levels\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-fast[=#]\fR: switch to ultra\-fast compression levels\. If \fB=#\fR is not present, it defaults to \fB1\fR\. The higher the value, the faster the compression speed, at the cost of some compression ratio\. This setting overwrites compression level if one was set previously\. Similarly, if a compression level is set after \fB\-\-fast\fR, it overrides it\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-T#\fR, \fB\-\-threads=#\fR: Compress using \fB#\fR working threads (default: 1)\. If \fB#\fR is 0, attempt to detect and use the number of physical CPU cores\. In all cases, the nb of threads is capped to \fBZSTDMT_NBWORKERS_MAX\fR, which is either 64 in 32\-bit mode, or 256 for 64\-bit environments\. This modifier does nothing if \fBzstd\fR is compiled without multithread support\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-single\-thread\fR: Does not spawn a thread for compression, use a single thread for both I/O and compression\. In this mode, compression is serialized with I/O, which is slightly slower\. (This is different from \fB\-T1\fR, which spawns 1 compression thread in parallel of I/O)\. This mode is the only one available when multithread support is disabled\. Single\-thread mode features lower memory usage\. Final compressed result is slightly different from \fB\-T1\fR\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-auto\-threads={physical,logical} (default: physical)\fR: When using a default amount of threads via \fB\-T0\fR, choose the default based on the number of detected physical or logical cores\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-adapt[=min=#,max=#]\fR : \fBzstd\fR will dynamically adapt compression level to perceived I/O conditions\. Compression level adaptation can be observed live by using command \fB\-v\fR\. Adaptation can be constrained between supplied \fBmin\fR and \fBmax\fR levels\. The feature works when combined with multi\-threading and \fB\-\-long\fR mode\. It does not work with \fB\-\-single\-thread\fR\. It sets window size to 8 MB by default (can be changed manually, see \fBwlog\fR)\. Due to the chaotic nature of dynamic adaptation, compressed result is not reproducible\. \fInote\fR : at the time of this writing, \fB\-\-adapt\fR can remain stuck at low speed when combined with multiple worker threads (>=2)\. -. -.IP "\(bu" 4 -\fB\-\-long[=#]\fR: enables long distance matching with \fB#\fR \fBwindowLog\fR, if not \fB#\fR is not present it defaults to \fB27\fR\. This increases the window size (\fBwindowLog\fR) and memory usage for both the compressor and decompressor\. This setting is designed to improve the compression ratio for files with long matches at a large distance\. -. +.IP "\[ci]" 4 +\fB\-\-long[=#]\fR: enables long distance matching with \fB#\fR \fBwindowLog\fR, if \fB#\fR is not present it defaults to \fB27\fR\. This increases the window size (\fBwindowLog\fR) and memory usage for both the compressor and decompressor\. This setting is designed to improve the compression ratio for files with long matches at a large distance\. .IP Note: If \fBwindowLog\fR is set to larger than 27, \fB\-\-long=windowLog\fR or \fB\-\-memory=windowSize\fR needs to be passed to the decompressor\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-D DICT\fR: use \fBDICT\fR as Dictionary to compress or decompress FILE(s) -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-patch\-from FILE\fR: Specify the file to be used as a reference point for zstd\'s diff engine\. This is effectively dictionary compression with some convenient parameter selection, namely that windowSize > srcSize\. -. .IP -Note: cannot use both this and \-D together Note: \fB\-\-long\fR mode will be automatically activated if chainLog < fileLog (fileLog being the windowLog required to cover the whole file)\. You can also manually force it\. Node: for all levels, you can use \-\-patch\-from in \-\-single\-thread mode to improve compression ratio at the cost of speed Note: for level 19, you can get increased compression ratio at the cost of speed by specifying \fB\-\-zstd=targetLength=\fR to be something large (i\.e 4096), and by setting a large \fB\-\-zstd=chainLog=\fR -. -.IP "\(bu" 4 +Note: cannot use both this and \-D together Note: \fB\-\-long\fR mode will be automatically activated if chainLog < fileLog (fileLog being the windowLog required to cover the whole file)\. You can also manually force it\. Note: for all levels, you can use \-\-patch\-from in \-\-single\-thread mode to improve compression ratio at the cost of speed Note: for level 19, you can get increased compression ratio at the cost of speed by specifying \fB\-\-zstd=targetLength=\fR to be something large (i\.e\. 4096), and by setting a large \fB\-\-zstd=chainLog=\fR +.IP "\[ci]" 4 \fB\-\-rsyncable\fR : \fBzstd\fR will periodically synchronize the compression state to make the compressed file more rsync\-friendly\. There is a negligible impact to compression ratio, and the faster compression levels will see a small compression speed hit\. This feature does not work with \fB\-\-single\-thread\fR\. You probably don\'t want to use it with long range mode, since it will decrease the effectiveness of the synchronization points, but your mileage may vary\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-C\fR, \fB\-\-[no\-]check\fR: add integrity check computed from uncompressed data (default: enabled) -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-[no\-]content\-size\fR: enable / disable whether or not the original size of the file is placed in the header of the compressed file\. The default option is \-\-content\-size (meaning that the original size will be placed in the header)\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-no\-dictID\fR: do not store dictionary ID within frame header (dictionary compression)\. The decoder will have to rely on implicit knowledge about which dictionary to use, it won\'t be able to check if it\'s correct\. -. -.IP "\(bu" 4 -\fB\-M#\fR, \fB\-\-memory=#\fR: Set a memory usage limit\. By default, Zstandard uses 128 MB for decompression as the maximum amount of memory the decompressor is allowed to use, but you can override this manually if need be in either direction (ie\. you can increase or decrease it)\. -. +.IP "\[ci]" 4 +\fB\-M#\fR, \fB\-\-memory=#\fR: Set a memory usage limit\. By default, Zstandard uses 128 MB for decompression as the maximum amount of memory the decompressor is allowed to use, but you can override this manually if need be in either direction (i\.e\. you can increase or decrease it)\. .IP This is also used during compression when using with \-\-patch\-from=\. In this case, this parameter overrides that maximum size allowed for a dictionary\. (128 MB)\. -. .IP Additionally, this can be used to limit memory for dictionary training\. This parameter overrides the default limit of 2 GB\. zstd will load training samples up to the memory limit and ignore the rest\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-stream\-size=#\fR : Sets the pledged source size of input coming from a stream\. This value must be exact, as it will be included in the produced frame header\. Incorrect stream sizes will cause an error\. This information will be used to better optimize compression parameters, resulting in better and potentially faster compression, especially for smaller source sizes\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-size\-hint=#\fR: When handling input from a stream, \fBzstd\fR must guess how large the source size will be when optimizing compression parameters\. If the stream size is relatively small, this guess may be a poor one, resulting in a higher compression ratio than expected\. This feature allows for controlling the guess when needed\. Exact guesses result in better compression ratios\. Overestimates result in slightly degraded compression ratios, while underestimates may result in significant degradation\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-o FILE\fR: save result into \fBFILE\fR -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console); keep original files unchanged\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-[no\-]sparse\fR: enable / disable sparse FS support, to make files with many zeroes smaller on disk\. Creating sparse files may save disk space and speed up decompression by reducing the amount of disk I/O\. default: enabled when output is into a file, and disabled when output is stdout\. This setting overrides default and can force sparse mode over stdout\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-rm\fR: remove source file(s) after successful compression or decompression\. If used in combination with \-o, will trigger a confirmation prompt (which can be silenced with \-f), as this is a destructive operation\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-k\fR, \fB\-\-keep\fR: keep source file(s) after successful compression or decompression\. This is the default behavior\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-r\fR: operate recursively on directories\. It selects all files in the named directory and all its subdirectories\. This can be useful both to reduce command line typing, and to circumvent shell expansion limitations, when there are a lot of files and naming breaks the maximum size of a command line\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-filelist FILE\fR read a list of files to process as content from \fBFILE\fR\. Format is compatible with \fBls\fR output, with one file per line\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-output\-dir\-flat DIR\fR: resulting files are stored into target \fBDIR\fR directory, instead of same directory as origin file\. Be aware that this command can introduce name collision issues, if multiple files, from different directories, end up having the same name\. Collision resolution ensures first file with a given name will be present in \fBDIR\fR, while in combination with \fB\-f\fR, the last file will be present instead\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-output\-dir\-mirror DIR\fR: similar to \fB\-\-output\-dir\-flat\fR, the output files are stored underneath target \fBDIR\fR directory, but this option will replicate input directory hierarchy into output \fBDIR\fR\. -. .IP If input directory contains "\.\.", the files in this directory will be ignored\. If input directory is an absolute directory (i\.e\. "/var/tmp/abc"), it will be stored into the "output\-dir/var/tmp/abc"\. If there are multiple input files or directories, name collision resolution will follow the same rules as \fB\-\-output\-dir\-flat\fR\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-format=FORMAT\fR: compress and decompress in other formats\. If compiled with support, zstd can compress to or decompress from other compression algorithm formats\. Possibly available options are \fBzstd\fR, \fBgzip\fR, \fBxz\fR, \fBlzma\fR, and \fBlz4\fR\. If no such format is provided, \fBzstd\fR is the default\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-h\fR/\fB\-H\fR, \fB\-\-help\fR: display help/long help and exit -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-V\fR, \fB\-\-version\fR: display version number and exit\. Advanced : \fB\-vV\fR also displays supported formats\. \fB\-vvV\fR also displays POSIX support\. \fB\-q\fR will only display the version number, suitable for machine reading\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-v\fR, \fB\-\-verbose\fR: verbose mode, display more information -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-q\fR, \fB\-\-quiet\fR: suppress warnings, interactivity, and notifications\. specify twice to suppress errors too\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-no\-progress\fR: do not display the progress bar, but keep all other messages\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-show\-default\-cparams\fR: Shows the default compression parameters that will be used for a particular src file\. If the provided src file is not a regular file (e\.g\. named pipe), the cli will just output the default parameters\. That is, the parameters that are used when the src size is unknown\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-\fR: All arguments after \fB\-\-\fR are treated as files -. .IP "" 0 -. .SS "gzip Operation modifiers" When invoked via a \fBgzip\fR symlink, \fBzstd\fR will support further options that intend to mimic the \fBgzip\fR behavior: -. .TP \fB\-n\fR, \fB\-\-no\-name\fR do not store the original filename and timestamps when compressing a file\. This is the default behavior and hence a no\-op\. -. .TP \fB\-\-best\fR alias to the option \fB\-9\fR\. -. -.SS "Restricted usage of Environment Variables" -Using environment variables to set parameters has security implications\. Therefore, this avenue is intentionally restricted\. Only \fBZSTD_CLEVEL\fR and \fBZSTD_NBTHREADS\fR are currently supported\. They set the compression level and number of threads to use during compression, respectively\. -. +.SS "Interactions with Environment Variables" +Employing environment variables to set parameters has security implications\. Therefore, this avenue is intentionally limited\. Only \fBZSTD_CLEVEL\fR and \fBZSTD_NBTHREADS\fR are currently supported\. They set the compression level and number of threads to use during compression, respectively\. .P \fBZSTD_CLEVEL\fR can be used to set the level between 1 and 19 (the "normal" range)\. If the value of \fBZSTD_CLEVEL\fR is not a valid integer, it will be ignored with a warning message\. \fBZSTD_CLEVEL\fR just replaces the default compression level (\fB3\fR)\. -. .P \fBZSTD_NBTHREADS\fR can be used to set the number of threads \fBzstd\fR will attempt to use during compression\. If the value of \fBZSTD_NBTHREADS\fR is not a valid unsigned integer, it will be ignored with a warning message\. \fBZSTD_NBTHREADS\fR has a default value of (\fB1\fR), and is capped at ZSTDMT_NBWORKERS_MAX==200\. \fBzstd\fR must be compiled with multithread support for this to have any effect\. -. .P They can both be overridden by corresponding command line arguments: \fB\-#\fR for compression level and \fB\-T#\fR for number of compression threads\. -. .SH "DICTIONARY BUILDER" -\fBzstd\fR offers \fIdictionary\fR compression, which greatly improves efficiency on small files and messages\. It\'s possible to train \fBzstd\fR with a set of samples, the result of which is saved into a file called a \fBdictionary\fR\. Then during compression and decompression, reference the same dictionary, using command \fB\-D dictionaryFileName\fR\. Compression of small files similar to the sample set will be greatly improved\. -. +\fBzstd\fR offers \fIdictionary\fR compression, which greatly improves efficiency on small files and messages\. It\'s possible to train \fBzstd\fR with a set of samples, the result of which is saved into a file called a \fBdictionary\fR\. Then, during compression and decompression, reference the same dictionary, using command \fB\-D dictionaryFileName\fR\. Compression of small files similar to the sample set will be greatly improved\. .TP \fB\-\-train FILEs\fR -Use FILEs as training set to create a dictionary\. The training set should contain a lot of small files (> 100), and weight typically 100x the target dictionary size (for example, 10 MB for a 100 KB dictionary)\. \fB\-\-train\fR can be combined with \fB\-r\fR to indicate a directory rather than listing all the files, which can be useful to circumvent shell expansion limits\. -. +Use FILEs as training set to create a dictionary\. The training set should ideally contain a lot of samples (> 100), and weight typically 100x the target dictionary size (for example, ~10 MB for a 100 KB dictionary)\. \fB\-\-train\fR can be combined with \fB\-r\fR to indicate a directory rather than listing all the files, which can be useful to circumvent shell expansion limits\. .IP -\fB\-\-train\fR supports multithreading if \fBzstd\fR is compiled with threading support (default)\. Additional parameters can be specified with \fB\-\-train\-fastcover\fR\. The legacy dictionary builder can be accessed with \fB\-\-train\-legacy\fR\. The slower cover dictionary builder can be accessed with \fB\-\-train\-cover\fR\. Default is equivalent to \fB\-\-train\-fastcover=d=8,steps=4\fR\. -. +Since dictionary compression is mostly effective for small files, the expectation is that the training set will only contain small files\. In the case where some samples happen to be large, only the first 128 KB of these samples will be used for training\. +.IP +\fB\-\-train\fR supports multithreading if \fBzstd\fR is compiled with threading support (default)\. Additional advanced parameters can be specified with \fB\-\-train\-fastcover\fR\. The legacy dictionary builder can be accessed with \fB\-\-train\-legacy\fR\. The slower cover dictionary builder can be accessed with \fB\-\-train\-cover\fR\. Default \fB\-\-train\fR is equivalent to \fB\-\-train\-fastcover=d=8,steps=4\fR\. .TP -\fB\-o file\fR -Dictionary saved into \fBfile\fR (default name: dictionary)\. -. +\fB\-o FILE\fR +Dictionary saved into \fBFILE\fR (default name: dictionary)\. .TP \fB\-\-maxdict=#\fR -Limit dictionary to specified size (default: 112640)\. -. +Limit dictionary to specified size (default: 112640 bytes)\. As usual, quantities are expressed in bytes by default, and it\'s possible to employ suffixes (like \fBKB\fR or \fBMB\fR) to specify larger values\. .TP \fB\-#\fR Use \fB#\fR compression level during training (optional)\. Will generate statistics more tuned for selected compression level, resulting in a \fIsmall\fR compression ratio improvement for this level\. -. .TP \fB\-B#\fR Split input files into blocks of size # (default: no split) -. .TP \fB\-M#\fR, \fB\-\-memory=#\fR -Limit the amount of sample data loaded for training (default: 2 GB)\. See above for details\. -. +Limit the amount of sample data loaded for training (default: 2 GB)\. Note that the default (2 GB) is also the maximum\. This parameter can be useful in situations where the training set size is not well controlled and could be potentially very large\. Since speed of the training process is directly correlated to the size of the training sample set, a smaller sample set leads to faster training\. +.IP +In situations where the training set is larger than maximum memory, the CLI will randomly select samples among the available ones, up to the maximum allowed memory budget\. This is meant to improve dictionary relevance by mitigating the potential impact of clustering, such as selecting only files from the beginning of a list sorted by modification date, or sorted by alphabetical order\. The randomization process is deterministic, so training of the same list of files with the same parameters will lead to the creation of the same dictionary\. .TP \fB\-\-dictID=#\fR -A dictionary ID is a locally unique ID that a decoder can use to verify it is using the right dictionary\. By default, zstd will create a 4\-bytes random number ID\. It\'s possible to give a precise number instead\. Short numbers have an advantage : an ID < 256 will only need 1 byte in the compressed frame header, and an ID < 65536 will only need 2 bytes\. This compares favorably to 4 bytes default\. However, it\'s up to the dictionary manager to not assign twice the same ID to 2 different dictionaries\. -. +A dictionary ID is a locally unique ID\. The decoder will use this value to verify it is using the right dictionary\. By default, zstd will create a 4\-bytes random number ID\. It\'s possible to provide an explicit number ID instead\. It\'s up to the dictionary manager to not assign twice the same ID to 2 different dictionaries\. Note that short numbers have an advantage : an ID < 256 will only need 1 byte in the compressed frame header, and an ID < 65536 will only need 2 bytes\. This compares favorably to 4 bytes default\. .TP \fB\-\-train\-cover[=k#,d=#,steps=#,split=#,shrink[=#]]\fR Select parameters for the default dictionary builder algorithm named cover\. If \fId\fR is not specified, then it tries \fId\fR = 6 and \fId\fR = 8\. If \fIk\fR is not specified, then it tries \fIsteps\fR values in the range [50, 2000]\. If \fIsteps\fR is not specified, then the default value of 40 is used\. If \fIsplit\fR is not specified or split <= 0, then the default value of 100 is used\. Requires that \fId\fR <= \fIk\fR\. If \fIshrink\fR flag is not used, then the default value for \fIshrinkDict\fR of 0 is used\. If \fIshrink\fR is not specified, then the default value for \fIshrinkDictMaxRegression\fR of 1 is used\. -. .IP Selects segments of size \fIk\fR with highest score to put in the dictionary\. The score of a segment is computed by the sum of the frequencies of all the subsegments of size \fId\fR\. Generally \fId\fR should be in the range [6, 8], occasionally up to 16, but the algorithm will run faster with d <= \fI8\fR\. Good values for \fIk\fR vary widely based on the input data, but a safe range is [2 * \fId\fR, 2000]\. If \fIsplit\fR is 100, all input samples are used for both training and testing to find optimal \fId\fR and \fIk\fR to build dictionary\. Supports multithreading if \fBzstd\fR is compiled with threading support\. Having \fIshrink\fR enabled takes a truncated dictionary of minimum size and doubles in size until compression ratio of the truncated dictionary is at most \fIshrinkDictMaxRegression%\fR worse than the compression ratio of the largest dictionary\. -. .IP Examples: -. .IP \fBzstd \-\-train\-cover FILEs\fR -. .IP \fBzstd \-\-train\-cover=k=50,d=8 FILEs\fR -. .IP \fBzstd \-\-train\-cover=d=8,steps=500 FILEs\fR -. .IP \fBzstd \-\-train\-cover=k=50 FILEs\fR -. .IP \fBzstd \-\-train\-cover=k=50,split=60 FILEs\fR -. .IP \fBzstd \-\-train\-cover=shrink FILEs\fR -. .IP \fBzstd \-\-train\-cover=shrink=2 FILEs\fR -. .TP \fB\-\-train\-fastcover[=k#,d=#,f=#,steps=#,split=#,accel=#]\fR Same as cover but with extra parameters \fIf\fR and \fIaccel\fR and different default value of split If \fIsplit\fR is not specified, then it tries \fIsplit\fR = 75\. If \fIf\fR is not specified, then it tries \fIf\fR = 20\. Requires that 0 < \fIf\fR < 32\. If \fIaccel\fR is not specified, then it tries \fIaccel\fR = 1\. Requires that 0 < \fIaccel\fR <= 10\. Requires that \fId\fR = 6 or \fId\fR = 8\. -. .IP \fIf\fR is log of size of array that keeps track of frequency of subsegments of size \fId\fR\. The subsegment is hashed to an index in the range [0,2^\fIf\fR \- 1]\. It is possible that 2 different subsegments are hashed to the same index, and they are considered as the same subsegment when computing frequency\. Using a higher \fIf\fR reduces collision but takes longer\. -. .IP Examples: -. .IP \fBzstd \-\-train\-fastcover FILEs\fR -. .IP \fBzstd \-\-train\-fastcover=d=8,f=15,accel=2 FILEs\fR -. .TP \fB\-\-train\-legacy[=selectivity=#]\fR -Use legacy dictionary builder algorithm with the given dictionary \fIselectivity\fR (default: 9)\. The smaller the \fIselectivity\fR value, the denser the dictionary, improving its efficiency but reducing its possible maximum size\. \fB\-\-train\-legacy=s=#\fR is also accepted\. -. +Use legacy dictionary builder algorithm with the given dictionary \fIselectivity\fR (default: 9)\. The smaller the \fIselectivity\fR value, the denser the dictionary, improving its efficiency but reducing its achievable maximum size\. \fB\-\-train\-legacy=s=#\fR is also accepted\. .IP Examples: -. .IP \fBzstd \-\-train\-legacy FILEs\fR -. .IP \fBzstd \-\-train\-legacy=selectivity=8 FILEs\fR -. .SH "BENCHMARK" -. .TP \fB\-b#\fR benchmark file(s) using compression level # -. .TP \fB\-e#\fR benchmark file(s) using multiple compression levels, from \fB\-b#\fR to \fB\-e#\fR (inclusive) -. .TP \fB\-i#\fR minimum evaluation time, in seconds (default: 3s), benchmark mode only -. .TP \fB\-B#\fR, \fB\-\-block\-size=#\fR cut file(s) into independent blocks of size # (default: no block) -. .TP \fB\-\-priority=rt\fR set process priority to real\-time -. .P \fBOutput Format:\fR CompressionLevel#Filename : IntputSize \-> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed -. .P \fBMethodology:\fR For both compression and decompression speed, the entire input is compressed/decompressed in\-memory to measure speed\. A run lasts at least 1 sec, so when files are small, they are compressed/decompressed several times per run, in order to improve measurement accuracy\. -. .SH "ADVANCED COMPRESSION OPTIONS" -. -.SS "\-B#:" -Select the size of each compression job\. This parameter is only available when multi\-threading is enabled\. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads\. Default job size varies depending on compression level (generally \fB4 * windowSize\fR)\. \fB\-B#\fR makes it possible to manually select a custom size\. Note that job size must respect a minimum value which is enforced transparently\. This minimum is either 512 KB, or \fBoverlapSize\fR, whichever is largest\. Different job sizes will lead to (slightly) different compressed frames\. -. +### \-B#: Specify the size of each compression job\. This parameter is only available when multi\-threading is enabled\. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads\. Default job size varies depending on compression level (generally \fB4 * windowSize\fR)\. \fB\-B#\fR makes it possible to manually select a custom size\. Note that job size must respect a minimum value which is enforced transparently\. This minimum is either 512 KB, or \fBoverlapSize\fR, whichever is largest\. Different job sizes will lead to non\-identical compressed frames\. .SS "\-\-zstd[=options]:" \fBzstd\fR provides 22 predefined compression levels\. The selected or default predefined compression level can be changed with advanced compression options\. The \fIoptions\fR are provided as a comma\-separated list\. You may specify only the options you want to change and the rest will be taken from the selected or default compression level\. The list of available \fIoptions\fR: -. .TP \fBstrategy\fR=\fIstrat\fR, \fBstrat\fR=\fIstrat\fR Specify a strategy used by a match finder\. -. .IP There are 9 strategies numbered from 1 to 9, from faster to stronger: 1=ZSTD_fast, 2=ZSTD_dfast, 3=ZSTD_greedy, 4=ZSTD_lazy, 5=ZSTD_lazy2, 6=ZSTD_btlazy2, 7=ZSTD_btopt, 8=ZSTD_btultra, 9=ZSTD_btultra2\. -. .TP \fBwindowLog\fR=\fIwlog\fR, \fBwlog\fR=\fIwlog\fR Specify the maximum number of bits for a match distance\. -. .IP The higher number of increases the chance to find a match which usually improves compression ratio\. It also increases memory requirements for the compressor and decompressor\. The minimum \fIwlog\fR is 10 (1 KiB) and the maximum is 30 (1 GiB) on 32\-bit platforms and 31 (2 GiB) on 64\-bit platforms\. -. .IP Note: If \fBwindowLog\fR is set to larger than 27, \fB\-\-long=windowLog\fR or \fB\-\-memory=windowSize\fR needs to be passed to the decompressor\. -. .TP \fBhashLog\fR=\fIhlog\fR, \fBhlog\fR=\fIhlog\fR Specify the maximum number of bits for a hash table\. -. .IP Bigger hash tables cause fewer collisions which usually makes compression faster, but requires more memory during compression\. -. .IP The minimum \fIhlog\fR is 6 (64 B) and the maximum is 30 (1 GiB)\. -. .TP \fBchainLog\fR=\fIclog\fR, \fBclog\fR=\fIclog\fR Specify the maximum number of bits for a hash chain or a binary tree\. -. .IP Higher numbers of bits increases the chance to find a match which usually improves compression ratio\. It also slows down compression speed and increases memory requirements for compression\. This option is ignored for the ZSTD_fast strategy\. -. .IP The minimum \fIclog\fR is 6 (64 B) and the maximum is 29 (524 Mib) on 32\-bit platforms and 30 (1 Gib) on 64\-bit platforms\. -. .TP \fBsearchLog\fR=\fIslog\fR, \fBslog\fR=\fIslog\fR Specify the maximum number of searches in a hash chain or a binary tree using logarithmic scale\. -. .IP More searches increases the chance to find a match which usually increases compression ratio but decreases compression speed\. -. .IP The minimum \fIslog\fR is 1 and the maximum is \'windowLog\' \- 1\. -. .TP \fBminMatch\fR=\fImml\fR, \fBmml\fR=\fImml\fR Specify the minimum searched length of a match in a hash table\. -. .IP Larger search lengths usually decrease compression ratio but improve decompression speed\. -. .IP The minimum \fImml\fR is 3 and the maximum is 7\. -. .TP \fBtargetLength\fR=\fItlen\fR, \fBtlen\fR=\fItlen\fR The impact of this field vary depending on selected strategy\. -. .IP For ZSTD_btopt, ZSTD_btultra and ZSTD_btultra2, it specifies the minimum match length that causes match finder to stop searching\. A larger \fBtargetLength\fR usually improves compression ratio but decreases compression speed\. t For ZSTD_fast, it triggers ultra\-fast mode when > 0\. The value represents the amount of data skipped between match sampling\. Impact is reversed : a larger \fBtargetLength\fR increases compression speed but decreases compression ratio\. -. .IP For all other strategies, this field has no impact\. -. .IP The minimum \fItlen\fR is 0 and the maximum is 128 Kib\. -. .TP \fBoverlapLog\fR=\fIovlog\fR, \fBovlog\fR=\fIovlog\fR Determine \fBoverlapSize\fR, amount of data reloaded from previous job\. This parameter is only available when multithreading is enabled\. Reloading more data improves compression ratio, but decreases speed\. -. .IP The minimum \fIovlog\fR is 0, and the maximum is 9\. 1 means "no overlap", hence completely independent jobs\. 9 means "full overlap", meaning up to \fBwindowSize\fR is reloaded from previous job\. Reducing \fIovlog\fR by 1 reduces the reloaded amount by a factor 2\. For example, 8 means "windowSize/2", and 6 means "windowSize/8"\. Value 0 is special and means "default" : \fIovlog\fR is automatically determined by \fBzstd\fR\. In which case, \fIovlog\fR will range from 6 to 9, depending on selected \fIstrat\fR\. -. .TP \fBldmHashLog\fR=\fIlhlog\fR, \fBlhlog\fR=\fIlhlog\fR Specify the maximum size for a hash table used for long distance matching\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Bigger hash tables usually improve compression ratio at the expense of more memory during compression and a decrease in compression speed\. -. .IP The minimum \fIlhlog\fR is 6 and the maximum is 30 (default: 20)\. -. .TP \fBldmMinMatch\fR=\fIlmml\fR, \fBlmml\fR=\fIlmml\fR Specify the minimum searched length of a match for long distance matching\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Larger/very small values usually decrease compression ratio\. -. .IP The minimum \fIlmml\fR is 4 and the maximum is 4096 (default: 64)\. -. .TP \fBldmBucketSizeLog\fR=\fIlblog\fR, \fBlblog\fR=\fIlblog\fR Specify the size of each bucket for the hash table used for long distance matching\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Larger bucket sizes improve collision resolution but decrease compression speed\. -. .IP The minimum \fIlblog\fR is 1 and the maximum is 8 (default: 3)\. -. .TP \fBldmHashRateLog\fR=\fIlhrlog\fR, \fBlhrlog\fR=\fIlhrlog\fR Specify the frequency of inserting entries into the long distance matching hash table\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Larger values will improve compression speed\. Deviating far from the default value will likely result in a decrease in compression ratio\. -. .IP The default value is \fBwlog \- lhlog\fR\. -. .SS "Example" The following parameters sets advanced compression options to something similar to predefined level 19 for files bigger than 256 KB: -. .P \fB\-\-zstd\fR=wlog=23,clog=23,hlog=22,slog=6,mml=3,tlen=48,strat=6 -. .SH "BUGS" Report bugs at: https://github\.com/facebook/zstd/issues -. .SH "AUTHOR" Yann Collet diff --git a/programs/zstdgrep.1 b/programs/zstdgrep.1 index 563696d33..4ece2ae50 100644 --- a/programs/zstdgrep.1 +++ b/programs/zstdgrep.1 @@ -1,26 +1,17 @@ -. -.TH "ZSTDGREP" "1" "January 2022" "zstd 1.5.2" "User Commands" -. +.TH "ZSTDGREP" "1" "April 2022" "zstd 1.5.2" "User Commands" .SH "NAME" \fBzstdgrep\fR \- print lines matching a pattern in zstandard\-compressed files -. .SH "SYNOPSIS" -\fBzstdgrep\fR [\fIgrep\-flags\fR] [\-\-] \fIpattern\fR [\fIfiles\fR \.\.\.] -. +\fBzstdgrep\fR [\fIgrep\-flags\fR] [\-\-] \fIpattern\fR [\fIfiles\fR \|\.\|\.\|\.] .SH "DESCRIPTION" \fBzstdgrep\fR runs \fBgrep (1)\fR on files, or \fBstdin\fR if no files argument is given, after decompressing them with \fBzstdcat (1)\fR\. -. .P The grep\-flags and pattern arguments are passed on to \fBgrep (1)\fR\. If an \fB\-e\fR flag is found in the \fBgrep\-flags\fR, \fBzstdgrep\fR will not look for a pattern argument\. -. .P Note that modern \fBgrep\fR alternatives such as \fBripgrep\fR (\fBrg\fR) support \fBzstd\fR\-compressed files out of the box, and can prove better alternatives than \fBzstdgrep\fR notably for unsupported complex pattern searches\. Note though that such alternatives may also feature some minor command line differences\. -. .SH "EXIT STATUS" In case of missing arguments or missing pattern, 1 will be returned, otherwise 0\. -. .SH "SEE ALSO" \fBzstd (1)\fR -. .SH "AUTHORS" Thomas Klausner \fIwiz@NetBSD\.org\fR diff --git a/programs/zstdless.1 b/programs/zstdless.1 index ab38e7a7f..36f21494d 100644 --- a/programs/zstdless.1 +++ b/programs/zstdless.1 @@ -1,14 +1,9 @@ -. -.TH "ZSTDLESS" "1" "January 2022" "zstd 1.5.2" "User Commands" -. +.TH "ZSTDLESS" "1" "April 2022" "zstd 1.5.2" "User Commands" .SH "NAME" \fBzstdless\fR \- view zstandard\-compressed files -. .SH "SYNOPSIS" -\fBzstdless\fR [\fIflags\fR] [\fIfile\fR \.\.\.] -. +\fBzstdless\fR [\fIflags\fR] [\fIfile\fR \|\.\|\.\|\.] .SH "DESCRIPTION" \fBzstdless\fR runs \fBless (1)\fR on files or stdin, if no files argument is given, after decompressing them with \fBzstdcat (1)\fR\. -. .SH "SEE ALSO" \fBzstd (1)\fR From 3536262f70abddae45f45455d3735d29282100f6 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 14 Apr 2022 14:19:19 -0400 Subject: [PATCH 120/472] Port noDict pipeline --- lib/compress/zstd_fast.c | 271 ++++++++++++++++++++++++++++++--------- 1 file changed, 209 insertions(+), 62 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 5da108c62..7b1d0dd43 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -587,11 +587,10 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( U32* const hashTable = ms->hashTable; U32 const hlog = cParams->hashLog; /* support stepSize of 0 */ - U32 const stepSize = cParams->targetLength + !(cParams->targetLength); + U32 const stepSize = cParams->targetLength + !(cParams->targetLength) + 1; const BYTE* const base = ms->window.base; const BYTE* const dictBase = ms->window.dictBase; const BYTE* const istart = (const BYTE*)src; - const BYTE* ip = istart; const BYTE* anchor = istart; const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); const U32 lowLimit = ZSTD_getLowestMatchIndex(ms, endIndex, cParams->windowLog); @@ -604,6 +603,29 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - 8; U32 offset_1=rep[0], offset_2=rep[1]; + U32 offsetSaved = 0; + + const BYTE* ip0 = istart; + const BYTE* ip1; + const BYTE* ip2; + const BYTE* ip3; + U32 current0; + + + size_t hash0; /* hash for ip0 */ + size_t hash1; /* hash for ip1 */ + U32 idx; /* match idx for ip0 */ + const BYTE* idxBase; /* base pointer for idx */ + U32 mval; /* src or dict value at match idx */ + + U32 offcode; + const BYTE* match0; + size_t mLength; + const BYTE* matchEnd = 0; /* initialize to avoid warning, assert != 0 later */ + + size_t step; + const BYTE* nextStep; + const size_t kStepIncr = (1 << (kSearchStrength - 1)); (void)hasStep; /* not currently specialized on whether it's accelerated */ @@ -613,75 +635,200 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( if (prefixStartIndex == dictStartIndex) return ZSTD_compressBlock_fast(ms, seqStore, rep, src, srcSize); - /* Search Loop */ - while (ip < ilimit) { /* < instead of <=, because (ip+1) */ - const size_t h = ZSTD_hashPtr(ip, hlog, mls); - const U32 matchIndex = hashTable[h]; - const BYTE* const matchBase = matchIndex < prefixStartIndex ? dictBase : base; - const BYTE* match = matchBase + matchIndex; - const U32 curr = (U32)(ip-base); - const U32 repIndex = curr + 1 - offset_1; + /* start each op */ +_start: /* Requires: ip0 */ + + step = stepSize; + nextStep = ip0 + kStepIncr; + + /* calculate positions, ip0 - anchor == 0, so we skip step calc */ + ip1 = ip0 + 1; + ip2 = ip0 + step; + ip3 = ip2 + 1; + + if (ip3 >= ilimit) { + goto _cleanup; + } + + hash0 = ZSTD_hashPtr(ip0, hlog, mls); + hash1 = ZSTD_hashPtr(ip1, hlog, mls); + + idx = hashTable[hash0]; + idxBase = idx < prefixStartIndex ? dictBase : base; + + do { + /* load repcode match for ip[2]*/ + const U32 current2 = (U32)(ip2 - base); + const U32 repIndex = current2 - offset_1; const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; - const BYTE* const repMatch = repBase + repIndex; - hashTable[h] = curr; /* update hash table */ - DEBUGLOG(7, "offset_1 = %u , curr = %u", offset_1, curr); + U32 rval; - if ( ( ((U32)((prefixStartIndex-1) - repIndex) >= 3) /* intentional underflow */ - & (offset_1 <= curr+1 - dictStartIndex) ) /* note: we are searching at curr+1 */ - && (MEM_read32(repMatch) == MEM_read32(ip+1)) ) { - const BYTE* const repMatchEnd = repIndex < prefixStartIndex ? dictEnd : iend; - size_t const rLength = ZSTD_count_2segments(ip+1 +4, repMatch +4, iend, repMatchEnd, prefixStart) + 4; - ip++; - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, REPCODE1_TO_OFFBASE, rLength); - ip += rLength; - anchor = ip; + /* load repcode match for ip[2] */ + assert(offset_1 > 0); + if ( ( ((U32)(prefixStartIndex - repIndex) >= 4) /* intentional underflow */ + & (offset_1 < current2 - dictStartIndex) ) ) { + rval = MEM_read32(repBase + repIndex); } else { - if ( (matchIndex < dictStartIndex) || - (MEM_read32(match) != MEM_read32(ip)) ) { - assert(stepSize >= 1); - ip += ((ip-anchor) >> kSearchStrength) + stepSize; - continue; - } - { const BYTE* const matchEnd = matchIndex < prefixStartIndex ? dictEnd : iend; - const BYTE* const lowMatchPtr = matchIndex < prefixStartIndex ? dictStart : prefixStart; - U32 const offset = curr - matchIndex; - size_t mLength = ZSTD_count_2segments(ip+4, match+4, iend, matchEnd, prefixStart) + 4; - while (((ip>anchor) & (match>lowMatchPtr)) && (ip[-1] == match[-1])) { ip--; match--; mLength++; } /* catch up */ - offset_2 = offset_1; offset_1 = offset; /* update offset history */ - ZSTD_storeSeq(seqStore, (size_t)(ip-anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); - ip += mLength; - anchor = ip; - } } + rval = MEM_read32(ip2) ^ 1; /* guaranteed to not match. */ + } - if (ip <= ilimit) { - /* Fill Table */ - hashTable[ZSTD_hashPtr(base+curr+2, hlog, mls)] = curr+2; - hashTable[ZSTD_hashPtr(ip-2, hlog, mls)] = (U32)(ip-2-base); - /* check immediate repcode */ - while (ip <= ilimit) { - U32 const current2 = (U32)(ip-base); - U32 const repIndex2 = current2 - offset_2; - const BYTE* const repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; - if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 <= curr - dictStartIndex)) /* intentional overflow */ - && (MEM_read32(repMatch2) == MEM_read32(ip)) ) { - const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; - size_t const repLength2 = ZSTD_count_2segments(ip+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; - { U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; } /* swap offset_2 <=> offset_1 */ - ZSTD_storeSeq(seqStore, 0 /*litlen*/, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); - hashTable[ZSTD_hashPtr(ip, hlog, mls)] = current2; - ip += repLength2; - anchor = ip; - continue; - } - break; - } } } + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* check repcode at ip[2] */ + if (MEM_read32(ip2) == rval) { + ip0 = ip2; + match0 = repBase + repIndex; + matchEnd = repIndex < prefixStartIndex ? dictEnd : iend; + assert((match0 != prefixStart) & (match0 != dictStart)); + mLength = ip0[-1] == match0[-1]; + ip0 -= mLength; + match0 -= mLength; + offcode = REPCODE1_TO_OFFBASE; + mLength += 4; + goto _match; + } + + /* load match for ip[0] */ + if (idx >= dictStartIndex) { + mval = MEM_read32(idxBase + idx); + } else { + mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ + } + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + goto _offset; + } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + idxBase = idx < prefixStartIndex ? dictBase : base; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip3; + + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; + + /* load match for ip[0] */ + if (idx >= dictStartIndex) { + mval = MEM_read32(idxBase + idx); + } else { + mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ + } + + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + goto _offset; + } + + /* lookup ip[1] */ + idx = hashTable[hash1]; + idxBase = idx < prefixStartIndex ? dictBase : base; + + /* hash ip[2] */ + hash0 = hash1; + hash1 = ZSTD_hashPtr(ip2, hlog, mls); + + /* advance to next positions */ + ip0 = ip1; + ip1 = ip2; + ip2 = ip0 + step; + ip3 = ip1 + step; + + /* calculate step */ + if (ip2 >= nextStep) { + step++; + PREFETCH_L1(ip1 + 64); + PREFETCH_L1(ip1 + 128); + nextStep += kStepIncr; + } + } while (ip3 < ilimit); + +_cleanup: + /* Note that there are probably still a couple positions we could search. + * However, it seems to be a meaningful performance hit to try to search + * them. So let's not. */ /* save reps for next block */ - rep[0] = offset_1; - rep[1] = offset_2; + rep[0] = offset_1 ? offset_1 : offsetSaved; + rep[1] = offset_2 ? offset_2 : offsetSaved; /* Return the last literals size */ return (size_t)(iend - anchor); + +_offset: /* Requires: ip0, idx */ + + /* Compute the offset code. */ + { U32 const offset = current0 - idx; + const BYTE* const lowMatchPtr = idx < prefixStartIndex ? dictStart : prefixStart; + matchEnd = idx < prefixStartIndex ? dictEnd : iend; + match0 = idxBase + idx; + offset_2 = offset_1; + offset_1 = offset; + offcode = OFFSET_TO_OFFBASE(offset); + mLength = 4; + + /* Count the backwards match length. */ + while (((ip0>anchor) & (match0>lowMatchPtr)) && (ip0[-1] == match0[-1])) { + ip0--; + match0--; + mLength++; + } } + +_match: /* Requires: ip0, match0, offcode */ + + /* Count the forward length. */ + assert(matchEnd != 0); + mLength += ZSTD_count_2segments(ip0 + mLength, match0 + mLength, iend, matchEnd, prefixStart); + + ZSTD_storeSeq(seqStore, (size_t)(ip0 - anchor), anchor, iend, offcode, mLength); + + ip0 += mLength; + anchor = ip0; + + /* write next hash table entry */ + if (ip1 < ip0) { + hashTable[hash1] = (U32)(ip1 - base); + } + + /* Fill table and check for immediate repcode. */ + if (ip0 <= ilimit) { + /* Fill Table */ + assert(base+current0+2 > istart); /* check base overflow */ + hashTable[ZSTD_hashPtr(base+current0+2, hlog, mls)] = current0+2; /* here because current+2 could be > iend-8 */ + hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); + + assert(offset_2 > 0); + while (ip0 <= ilimit) { + U32 const repIndex2 = (U32)(ip0-base) - offset_2; + const BYTE* const repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; + if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 <= (U32)(ip0-base) - dictStartIndex)) /* intentional overflow */ + && (MEM_read32(repMatch2) == MEM_read32(ip0)) ) { + const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; + size_t const repLength2 = ZSTD_count_2segments(ip0+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; + { U32 const tmpOffset = offset_2; offset_2 = offset_1; offset_1 = tmpOffset; } /* swap offset_2 <=> offset_1 */ + ZSTD_storeSeq(seqStore, 0 /*litlen*/, anchor, iend, REPCODE1_TO_OFFBASE, repLength2); + hashTable[ZSTD_hashPtr(ip0, hlog, mls)] = (U32)(ip0-base); + ip0 += repLength2; + anchor = ip0; + continue; + } + break; + } } + + goto _start; } ZSTD_GEN_FAST_FN(extDict, 4, 0) From 2820efe7ec931906ce052771afc04ddd12a8cfa8 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 19 Apr 2022 11:36:06 -0400 Subject: [PATCH 121/472] Nits --- lib/compress/zstd_fast.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 7b1d0dd43..e201e8620 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -603,7 +603,6 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - 8; U32 offset_1=rep[0], offset_2=rep[1]; - U32 offsetSaved = 0; const BYTE* ip0 = istart; const BYTE* ip1; @@ -616,7 +615,6 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( size_t hash1; /* hash for ip1 */ U32 idx; /* match idx for ip0 */ const BYTE* idxBase; /* base pointer for idx */ - U32 mval; /* src or dict value at match idx */ U32 offcode; const BYTE* match0; @@ -657,13 +655,13 @@ _start: /* Requires: ip0 */ idxBase = idx < prefixStartIndex ? dictBase : base; do { - /* load repcode match for ip[2]*/ + U32 mval; /* src or dict value at match idx */ + + /* load repcode match for ip[2] */ const U32 current2 = (U32)(ip2 - base); const U32 repIndex = current2 - offset_1; const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; U32 rval; - - /* load repcode match for ip[2] */ assert(offset_1 > 0); if ( ( ((U32)(prefixStartIndex - repIndex) >= 4) /* intentional underflow */ & (offset_1 < current2 - dictStartIndex) ) ) { @@ -762,13 +760,13 @@ _cleanup: * them. So let's not. */ /* save reps for next block */ - rep[0] = offset_1 ? offset_1 : offsetSaved; - rep[1] = offset_2 ? offset_2 : offsetSaved; + rep[0] = offset_1; + rep[1] = offset_2; /* Return the last literals size */ return (size_t)(iend - anchor); -_offset: /* Requires: ip0, idx */ +_offset: /* Requires: ip0, idx, idxBase */ /* Compute the offset code. */ { U32 const offset = current0 - idx; @@ -787,7 +785,7 @@ _offset: /* Requires: ip0, idx */ mLength++; } } -_match: /* Requires: ip0, match0, offcode */ +_match: /* Requires: ip0, match0, offcode, matchEnd */ /* Count the forward length. */ assert(matchEnd != 0); From 809f65291266de966ba4262220992f5f7e7903a0 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 20 Apr 2022 11:50:00 -0400 Subject: [PATCH 122/472] Optimize repcode predicate, hardcode hasStep == 0 scenario, cosmetic fixes --- lib/compress/zstd_fast.c | 151 +++++++++++++++++++++------------------ 1 file changed, 81 insertions(+), 70 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index e201e8620..c6e9dd33a 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -587,7 +587,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( U32* const hashTable = ms->hashTable; U32 const hlog = cParams->hashLog; /* support stepSize of 0 */ - U32 const stepSize = cParams->targetLength + !(cParams->targetLength) + 1; + size_t const stepSize = hasStep ? (cParams->targetLength + !(cParams->targetLength) + 1) : 2; const BYTE* const base = ms->window.base; const BYTE* const dictBase = ms->window.dictBase; const BYTE* const istart = (const BYTE*)src; @@ -625,14 +625,18 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* nextStep; const size_t kStepIncr = (1 << (kSearchStrength - 1)); - (void)hasStep; /* not currently specialized on whether it's accelerated */ - DEBUGLOG(5, "ZSTD_compressBlock_fast_extDict_generic (offset_1=%u)", offset_1); /* switch to "regular" variant if extDict is invalidated due to maxDistance */ if (prefixStartIndex == dictStartIndex) return ZSTD_compressBlock_fast(ms, seqStore, rep, src, srcSize); + { U32 const curr = (U32)(ip0 - base); + U32 const maxRep = curr - dictStartIndex; + if (offset_2 >= maxRep) offset_2 = 0; + if (offset_1 >= maxRep) offset_1 = 0; + } + /* start each op */ _start: /* Requires: ip0 */ @@ -655,51 +659,44 @@ _start: /* Requires: ip0 */ idxBase = idx < prefixStartIndex ? dictBase : base; do { - U32 mval; /* src or dict value at match idx */ + { /* load repcode match for ip[2] */ + U32 const current2 = (U32)(ip2 - base); + U32 const repIndex = current2 - offset_1; + const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; + U32 rval; + if ( ((U32)(prefixStartIndex - repIndex) >= 4) /* intentional underflow */ + & (offset_1 > 0) ) { + rval = MEM_read32(repBase + repIndex); + } else { + rval = MEM_read32(ip2) ^ 1; /* guaranteed to not match. */ + } - /* load repcode match for ip[2] */ - const U32 current2 = (U32)(ip2 - base); - const U32 repIndex = current2 - offset_1; - const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; - U32 rval; - assert(offset_1 > 0); - if ( ( ((U32)(prefixStartIndex - repIndex) >= 4) /* intentional underflow */ - & (offset_1 < current2 - dictStartIndex) ) ) { - rval = MEM_read32(repBase + repIndex); - } else { - rval = MEM_read32(ip2) ^ 1; /* guaranteed to not match. */ - } + /* write back hash table entry */ + current0 = (U32)(ip0 - base); + hashTable[hash0] = current0; - /* write back hash table entry */ - current0 = (U32)(ip0 - base); - hashTable[hash0] = current0; + /* check repcode at ip[2] */ + if (MEM_read32(ip2) == rval) { + ip0 = ip2; + match0 = repBase + repIndex; + matchEnd = repIndex < prefixStartIndex ? dictEnd : iend; + assert((match0 != prefixStart) & (match0 != dictStart)); + mLength = ip0[-1] == match0[-1]; + ip0 -= mLength; + match0 -= mLength; + offcode = REPCODE1_TO_OFFBASE; + mLength += 4; + goto _match; + } } - /* check repcode at ip[2] */ - if (MEM_read32(ip2) == rval) { - ip0 = ip2; - match0 = repBase + repIndex; - matchEnd = repIndex < prefixStartIndex ? dictEnd : iend; - assert((match0 != prefixStart) & (match0 != dictStart)); - mLength = ip0[-1] == match0[-1]; - ip0 -= mLength; - match0 -= mLength; - offcode = REPCODE1_TO_OFFBASE; - mLength += 4; - goto _match; - } + { /* load match for ip[0] */ + U32 const mval = idx >= dictStartIndex ? MEM_read32(idxBase + idx) : MEM_read32(ip0) ^ 1; /* guaranteed not to match */ - /* load match for ip[0] */ - if (idx >= dictStartIndex) { - mval = MEM_read32(idxBase + idx); - } else { - mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ - } - - /* check match at ip[0] */ - if (MEM_read32(ip0) == mval) { - /* found a match! */ - goto _offset; - } + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + goto _offset; + } } /* lookup ip[1] */ idx = hashTable[hash1]; @@ -718,18 +715,14 @@ _start: /* Requires: ip0 */ current0 = (U32)(ip0 - base); hashTable[hash0] = current0; - /* load match for ip[0] */ - if (idx >= dictStartIndex) { - mval = MEM_read32(idxBase + idx); - } else { - mval = MEM_read32(ip0) ^ 1; /* guaranteed to not match. */ - } + { /* load match for ip[0] */ + U32 const mval = idx >= dictStartIndex ? MEM_read32(idxBase + idx) : MEM_read32(ip0) ^ 1; /* guaranteed not to match */ - /* check match at ip[0] */ - if (MEM_read32(ip0) == mval) { - /* found a match! */ - goto _offset; - } + /* check match at ip[0] */ + if (MEM_read32(ip0) == mval) { + /* found a match! */ + goto _offset; + } } /* lookup ip[1] */ idx = hashTable[hash1]; @@ -760,8 +753,8 @@ _cleanup: * them. So let's not. */ /* save reps for next block */ - rep[0] = offset_1; - rep[1] = offset_2; + rep[0] = offset_1 ? offset_1 : rep[0]; + rep[1] = offset_2 ? offset_2 : rep[1]; /* Return the last literals size */ return (size_t)(iend - anchor); @@ -808,11 +801,10 @@ _match: /* Requires: ip0, match0, offcode, matchEnd */ hashTable[ZSTD_hashPtr(base+current0+2, hlog, mls)] = current0+2; /* here because current+2 could be > iend-8 */ hashTable[ZSTD_hashPtr(ip0-2, hlog, mls)] = (U32)(ip0-2-base); - assert(offset_2 > 0); while (ip0 <= ilimit) { U32 const repIndex2 = (U32)(ip0-base) - offset_2; const BYTE* const repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; - if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 <= (U32)(ip0-base) - dictStartIndex)) /* intentional overflow */ + if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 > 0)) /* intentional underflow */ && (MEM_read32(repMatch2) == MEM_read32(ip0)) ) { const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip0+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; @@ -829,6 +821,11 @@ _match: /* Requires: ip0, match0, offcode, matchEnd */ goto _start; } +ZSTD_GEN_FAST_FN(extDict, 4, 1) +ZSTD_GEN_FAST_FN(extDict, 5, 1) +ZSTD_GEN_FAST_FN(extDict, 6, 1) +ZSTD_GEN_FAST_FN(extDict, 7, 1) + ZSTD_GEN_FAST_FN(extDict, 4, 0) ZSTD_GEN_FAST_FN(extDict, 5, 0) ZSTD_GEN_FAST_FN(extDict, 6, 0) @@ -839,16 +836,30 @@ size_t ZSTD_compressBlock_fast_extDict( void const* src, size_t srcSize) { U32 const mls = ms->cParams.minMatch; - switch(mls) - { - default: /* includes case 3 */ - case 4 : - return ZSTD_compressBlock_fast_extDict_4_0(ms, seqStore, rep, src, srcSize); - case 5 : - return ZSTD_compressBlock_fast_extDict_5_0(ms, seqStore, rep, src, srcSize); - case 6 : - return ZSTD_compressBlock_fast_extDict_6_0(ms, seqStore, rep, src, srcSize); - case 7 : - return ZSTD_compressBlock_fast_extDict_7_0(ms, seqStore, rep, src, srcSize); + assert(ms->dictMatchState == NULL); + if (ms->cParams.targetLength > 1) { + switch (mls) { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_extDict_4_1(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_extDict_5_1(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_extDict_6_1(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_extDict_7_1(ms, seqStore, rep, src, srcSize); + } + } else { + switch (mls) { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_extDict_4_0(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_extDict_5_0(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_extDict_6_0(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_extDict_7_0(ms, seqStore, rep, src, srcSize); + } } } From 05796796fd0a9bc972abf3097557f68d6ae93ef4 Mon Sep 17 00:00:00 2001 From: cuishuang Date: Tue, 26 Apr 2022 17:40:23 +0800 Subject: [PATCH 123/472] fix some typos Signed-off-by: cuishuang --- contrib/freestanding_lib/freestanding.py | 4 ++-- doc/decompressor_errata.md | 2 +- lib/common/xxhash.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/freestanding_lib/freestanding.py b/contrib/freestanding_lib/freestanding.py index cd9d63774..4a02dea14 100755 --- a/contrib/freestanding_lib/freestanding.py +++ b/contrib/freestanding_lib/freestanding.py @@ -340,7 +340,7 @@ class PartialPreprocessor(object): if macro2 is not None and not resolved: assert ifdef and defined and op == '&&' and cmp is not None - # If the statment is true, but we have a single value check, then + # If the statement is true, but we have a single value check, then # check the value. defined_value = self._defs[macro] are_ints = True @@ -690,7 +690,7 @@ def main(name, args): parser.add_argument("--rewrite-include", default=[], dest="rewritten_includes", action="append", help="Rewrite an include REGEX=NEW (e.g. '=')") parser.add_argument("--sed", default=[], dest="seds", action="append", help="Apply a sed replacement. Format: `s/REGEX/FORMAT/[g]`. REGEX is a Python regex. FORMAT is a Python format string formatted by the regex dict.") parser.add_argument("-D", "--define", default=[], dest="defs", action="append", help="Pre-define this macro (can be passed multiple times)") - parser.add_argument("-U", "--undefine", default=[], dest="undefs", action="append", help="Pre-undefine this macro (can be passed mutliple times)") + parser.add_argument("-U", "--undefine", default=[], dest="undefs", action="append", help="Pre-undefine this macro (can be passed multiple times)") parser.add_argument("-R", "--replace", default=[], dest="replaces", action="append", help="Pre-define this macro and replace the first ifndef block with its definition") parser.add_argument("-E", "--exclude", default=[], dest="excludes", action="append", help="Exclude all lines between 'BEGIN ' and 'END '") args = parser.parse_args(args) diff --git a/doc/decompressor_errata.md b/doc/decompressor_errata.md index 9c1126401..b162e7fd6 100644 --- a/doc/decompressor_errata.md +++ b/doc/decompressor_errata.md @@ -27,7 +27,7 @@ The zstd decoder incorrectly rejected blocks of type `Compressed_Block` that enc This type of block was never generated by the reference compressor. -Additionally, these blocks were disallowed by the spec up until spec version 0.3.2 when the restriciton was lifted by [PR#1689](https://github.com/facebook/zstd/pull/1689). +Additionally, these blocks were disallowed by the spec up until spec version 0.3.2 when the restriction was lifted by [PR#1689](https://github.com/facebook/zstd/pull/1689). > A Compressed_Block has the extra restriction that Block_Size is always strictly less than the decompressed size. If this condition cannot be respected, the block must be sent uncompressed instead (Raw_Block). diff --git a/lib/common/xxhash.h b/lib/common/xxhash.h index acac7ad62..f87102a1d 100644 --- a/lib/common/xxhash.h +++ b/lib/common/xxhash.h @@ -3026,7 +3026,7 @@ enum XXH_VECTOR_TYPE /* fake enum */ { * have more than 2 NEON (F0/F1) micro-ops. If you are only using NEON instructions, * you are only using 2/3 of the CPU bandwidth. * - * This is even more noticable on the more advanced cores like the A76 which + * This is even more noticeable on the more advanced cores like the A76 which * can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once. * * Therefore, @ref XXH3_NEON_LANES lanes will be processed using NEON, and the From 518cb83833074d304dfcaa93cfc16039ea4683c8 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 26 Apr 2022 17:54:25 -0400 Subject: [PATCH 124/472] Hardcode repcode safety check, fix cosmetic nits --- lib/compress/zstd_fast.c | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index c6e9dd33a..49a2add75 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -581,13 +581,13 @@ size_t ZSTD_compressBlock_fast_dictMatchState( static size_t ZSTD_compressBlock_fast_extDict_generic( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize, U32 const mls, U32 const hasStep) + void const* src, size_t srcSize, U32 const mls, U32 const commonScenario) { const ZSTD_compressionParameters* const cParams = &ms->cParams; U32* const hashTable = ms->hashTable; U32 const hlog = cParams->hashLog; /* support stepSize of 0 */ - size_t const stepSize = hasStep ? (cParams->targetLength + !(cParams->targetLength) + 1) : 2; + size_t const stepSize = commonScenario ? 2 : (cParams->targetLength + !(cParams->targetLength) + 1); const BYTE* const base = ms->window.base; const BYTE* const dictBase = ms->window.dictBase; const BYTE* const istart = (const BYTE*)src; @@ -633,9 +633,13 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( { U32 const curr = (U32)(ip0 - base); U32 const maxRep = curr - dictStartIndex; - if (offset_2 >= maxRep) offset_2 = 0; - if (offset_1 >= maxRep) offset_1 = 0; - } + if (commonScenario) { + assert(offset_2 < maxRep); + assert(offset_1 < maxRep); + } else { + if (offset_2 >= maxRep) offset_2 = 0; + if (offset_1 >= maxRep) offset_1 = 0; + } } /* start each op */ _start: /* Requires: ip0 */ @@ -665,7 +669,7 @@ _start: /* Requires: ip0 */ const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; U32 rval; if ( ((U32)(prefixStartIndex - repIndex) >= 4) /* intentional underflow */ - & (offset_1 > 0) ) { + & (commonScenario | (offset_1 > 0)) ) { rval = MEM_read32(repBase + repIndex); } else { rval = MEM_read32(ip2) ^ 1; /* guaranteed to not match. */ @@ -690,7 +694,9 @@ _start: /* Requires: ip0 */ } } { /* load match for ip[0] */ - U32 const mval = idx >= dictStartIndex ? MEM_read32(idxBase + idx) : MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + U32 const mval = idx >= dictStartIndex ? + MEM_read32(idxBase + idx) : + MEM_read32(ip0) ^ 1; /* guaranteed not to match */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { @@ -716,7 +722,9 @@ _start: /* Requires: ip0 */ hashTable[hash0] = current0; { /* load match for ip[0] */ - U32 const mval = idx >= dictStartIndex ? MEM_read32(idxBase + idx) : MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + U32 const mval = idx >= dictStartIndex ? + MEM_read32(idxBase + idx) : + MEM_read32(ip0) ^ 1; /* guaranteed not to match */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { @@ -804,7 +812,7 @@ _match: /* Requires: ip0, match0, offcode, matchEnd */ while (ip0 <= ilimit) { U32 const repIndex2 = (U32)(ip0-base) - offset_2; const BYTE* const repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; - if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 > 0)) /* intentional underflow */ + if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (commonScenario | (offset_2 > 0))) /* intentional underflow */ && (MEM_read32(repMatch2) == MEM_read32(ip0)) ) { const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip0+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; @@ -836,8 +844,17 @@ size_t ZSTD_compressBlock_fast_extDict( void const* src, size_t srcSize) { U32 const mls = ms->cParams.minMatch; + const BYTE* const istart = (const BYTE*)src; + const BYTE* const base = ms->window.base; + const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); + const U32 lowLimit = ZSTD_getLowestMatchIndex(ms, endIndex, ms->cParams.windowLog); + U32 const curr = (U32)(istart - base); + U32 const maxRep = curr - lowLimit; + U32 const repOffsetsAreValid = (rep[0] < maxRep) & (rep[1] < maxRep); + + assert((rep[0] > 0) & (rep[1] > 0)); assert(ms->dictMatchState == NULL); - if (ms->cParams.targetLength > 1) { + if ((ms->cParams.targetLength <= 1) & repOffsetsAreValid) { switch (mls) { default: /* includes case 3 */ case 4 : From 6a2e1f7c69f32427afc2f0273d3f4fe923a98a94 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 27 Apr 2022 18:16:21 -0400 Subject: [PATCH 125/472] Revert "Hardcode repcode safety check, fix cosmetic nits" This reverts commit 518cb83833074d304dfcaa93cfc16039ea4683c8. --- lib/compress/zstd_fast.c | 37 ++++++++++--------------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 49a2add75..c6e9dd33a 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -581,13 +581,13 @@ size_t ZSTD_compressBlock_fast_dictMatchState( static size_t ZSTD_compressBlock_fast_extDict_generic( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], - void const* src, size_t srcSize, U32 const mls, U32 const commonScenario) + void const* src, size_t srcSize, U32 const mls, U32 const hasStep) { const ZSTD_compressionParameters* const cParams = &ms->cParams; U32* const hashTable = ms->hashTable; U32 const hlog = cParams->hashLog; /* support stepSize of 0 */ - size_t const stepSize = commonScenario ? 2 : (cParams->targetLength + !(cParams->targetLength) + 1); + size_t const stepSize = hasStep ? (cParams->targetLength + !(cParams->targetLength) + 1) : 2; const BYTE* const base = ms->window.base; const BYTE* const dictBase = ms->window.dictBase; const BYTE* const istart = (const BYTE*)src; @@ -633,13 +633,9 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( { U32 const curr = (U32)(ip0 - base); U32 const maxRep = curr - dictStartIndex; - if (commonScenario) { - assert(offset_2 < maxRep); - assert(offset_1 < maxRep); - } else { - if (offset_2 >= maxRep) offset_2 = 0; - if (offset_1 >= maxRep) offset_1 = 0; - } } + if (offset_2 >= maxRep) offset_2 = 0; + if (offset_1 >= maxRep) offset_1 = 0; + } /* start each op */ _start: /* Requires: ip0 */ @@ -669,7 +665,7 @@ _start: /* Requires: ip0 */ const BYTE* const repBase = repIndex < prefixStartIndex ? dictBase : base; U32 rval; if ( ((U32)(prefixStartIndex - repIndex) >= 4) /* intentional underflow */ - & (commonScenario | (offset_1 > 0)) ) { + & (offset_1 > 0) ) { rval = MEM_read32(repBase + repIndex); } else { rval = MEM_read32(ip2) ^ 1; /* guaranteed to not match. */ @@ -694,9 +690,7 @@ _start: /* Requires: ip0 */ } } { /* load match for ip[0] */ - U32 const mval = idx >= dictStartIndex ? - MEM_read32(idxBase + idx) : - MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + U32 const mval = idx >= dictStartIndex ? MEM_read32(idxBase + idx) : MEM_read32(ip0) ^ 1; /* guaranteed not to match */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { @@ -722,9 +716,7 @@ _start: /* Requires: ip0 */ hashTable[hash0] = current0; { /* load match for ip[0] */ - U32 const mval = idx >= dictStartIndex ? - MEM_read32(idxBase + idx) : - MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + U32 const mval = idx >= dictStartIndex ? MEM_read32(idxBase + idx) : MEM_read32(ip0) ^ 1; /* guaranteed not to match */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { @@ -812,7 +804,7 @@ _match: /* Requires: ip0, match0, offcode, matchEnd */ while (ip0 <= ilimit) { U32 const repIndex2 = (U32)(ip0-base) - offset_2; const BYTE* const repMatch2 = repIndex2 < prefixStartIndex ? dictBase + repIndex2 : base + repIndex2; - if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (commonScenario | (offset_2 > 0))) /* intentional underflow */ + if ( (((U32)((prefixStartIndex-1) - repIndex2) >= 3) & (offset_2 > 0)) /* intentional underflow */ && (MEM_read32(repMatch2) == MEM_read32(ip0)) ) { const BYTE* const repEnd2 = repIndex2 < prefixStartIndex ? dictEnd : iend; size_t const repLength2 = ZSTD_count_2segments(ip0+4, repMatch2+4, iend, repEnd2, prefixStart) + 4; @@ -844,17 +836,8 @@ size_t ZSTD_compressBlock_fast_extDict( void const* src, size_t srcSize) { U32 const mls = ms->cParams.minMatch; - const BYTE* const istart = (const BYTE*)src; - const BYTE* const base = ms->window.base; - const U32 endIndex = (U32)((size_t)(istart - base) + srcSize); - const U32 lowLimit = ZSTD_getLowestMatchIndex(ms, endIndex, ms->cParams.windowLog); - U32 const curr = (U32)(istart - base); - U32 const maxRep = curr - lowLimit; - U32 const repOffsetsAreValid = (rep[0] < maxRep) & (rep[1] < maxRep); - - assert((rep[0] > 0) & (rep[1] > 0)); assert(ms->dictMatchState == NULL); - if ((ms->cParams.targetLength <= 1) & repOffsetsAreValid) { + if (ms->cParams.targetLength > 1) { switch (mls) { default: /* includes case 3 */ case 4 : From ce6b69f5c593a4ee06f8a09517141dbd1ee12621 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 28 Apr 2022 14:49:45 -0400 Subject: [PATCH 126/472] Final nit --- lib/compress/zstd_fast.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index c6e9dd33a..959a392a4 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -690,7 +690,9 @@ _start: /* Requires: ip0 */ } } { /* load match for ip[0] */ - U32 const mval = idx >= dictStartIndex ? MEM_read32(idxBase + idx) : MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + U32 const mval = idx >= dictStartIndex ? + MEM_read32(idxBase + idx) : + MEM_read32(ip0) ^ 1; /* guaranteed not to match */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { @@ -716,7 +718,9 @@ _start: /* Requires: ip0 */ hashTable[hash0] = current0; { /* load match for ip[0] */ - U32 const mval = idx >= dictStartIndex ? MEM_read32(idxBase + idx) : MEM_read32(ip0) ^ 1; /* guaranteed not to match */ + U32 const mval = idx >= dictStartIndex ? + MEM_read32(idxBase + idx) : + MEM_read32(ip0) ^ 1; /* guaranteed not to match */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { From ac371be27b443e488de824a7a0e365fd6d4ac536 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 28 Apr 2022 18:05:39 -0400 Subject: [PATCH 127/472] Remove hasStep variant (not enough wins to justify the code size increase) --- lib/compress/zstd_fast.c | 44 +++++++++++++--------------------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 959a392a4..198ccaee3 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -587,7 +587,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( U32* const hashTable = ms->hashTable; U32 const hlog = cParams->hashLog; /* support stepSize of 0 */ - size_t const stepSize = hasStep ? (cParams->targetLength + !(cParams->targetLength) + 1) : 2; + size_t const stepSize = cParams->targetLength + !(cParams->targetLength) + 1; const BYTE* const base = ms->window.base; const BYTE* const dictBase = ms->window.dictBase; const BYTE* const istart = (const BYTE*)src; @@ -625,6 +625,8 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* nextStep; const size_t kStepIncr = (1 << (kSearchStrength - 1)); + (void)hasStep; /* not currently specialized on whether it's accelerated */ + DEBUGLOG(5, "ZSTD_compressBlock_fast_extDict_generic (offset_1=%u)", offset_1); /* switch to "regular" variant if extDict is invalidated due to maxDistance */ @@ -825,11 +827,6 @@ _match: /* Requires: ip0, match0, offcode, matchEnd */ goto _start; } -ZSTD_GEN_FAST_FN(extDict, 4, 1) -ZSTD_GEN_FAST_FN(extDict, 5, 1) -ZSTD_GEN_FAST_FN(extDict, 6, 1) -ZSTD_GEN_FAST_FN(extDict, 7, 1) - ZSTD_GEN_FAST_FN(extDict, 4, 0) ZSTD_GEN_FAST_FN(extDict, 5, 0) ZSTD_GEN_FAST_FN(extDict, 6, 0) @@ -841,29 +838,16 @@ size_t ZSTD_compressBlock_fast_extDict( { U32 const mls = ms->cParams.minMatch; assert(ms->dictMatchState == NULL); - if (ms->cParams.targetLength > 1) { - switch (mls) { - default: /* includes case 3 */ - case 4 : - return ZSTD_compressBlock_fast_extDict_4_1(ms, seqStore, rep, src, srcSize); - case 5 : - return ZSTD_compressBlock_fast_extDict_5_1(ms, seqStore, rep, src, srcSize); - case 6 : - return ZSTD_compressBlock_fast_extDict_6_1(ms, seqStore, rep, src, srcSize); - case 7 : - return ZSTD_compressBlock_fast_extDict_7_1(ms, seqStore, rep, src, srcSize); - } - } else { - switch (mls) { - default: /* includes case 3 */ - case 4 : - return ZSTD_compressBlock_fast_extDict_4_0(ms, seqStore, rep, src, srcSize); - case 5 : - return ZSTD_compressBlock_fast_extDict_5_0(ms, seqStore, rep, src, srcSize); - case 6 : - return ZSTD_compressBlock_fast_extDict_6_0(ms, seqStore, rep, src, srcSize); - case 7 : - return ZSTD_compressBlock_fast_extDict_7_0(ms, seqStore, rep, src, srcSize); - } + switch(mls) + { + default: /* includes case 3 */ + case 4 : + return ZSTD_compressBlock_fast_extDict_4_0(ms, seqStore, rep, src, srcSize); + case 5 : + return ZSTD_compressBlock_fast_extDict_5_0(ms, seqStore, rep, src, srcSize); + case 6 : + return ZSTD_compressBlock_fast_extDict_6_0(ms, seqStore, rep, src, srcSize); + case 7 : + return ZSTD_compressBlock_fast_extDict_7_0(ms, seqStore, rep, src, srcSize); } } From df6eefb3bbe18901875ffb7eef5bdb5e84066d7e Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Mon, 9 Aug 2021 23:19:52 -0400 Subject: [PATCH 128/472] meson: avoid rebuilding some libzstd files in the test programs The poolTests program already linked to libzstd, and later to libtestcommon with included libzstd objects. So this was redundant. Minus 4 compile steps. --- build/meson/tests/meson.build | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/build/meson/tests/meson.build b/build/meson/tests/meson.build index 14f45982a..cf876a395 100644 --- a/build/meson/tests/meson.build +++ b/build/meson/tests/meson.build @@ -116,11 +116,7 @@ decodecorpus = executable('decodecorpus', dependencies: [ testcommon_dep, libm_dep ], install: false) -poolTests_sources = [join_paths(zstd_rootdir, 'tests/poolTests.c'), - join_paths(zstd_rootdir, 'lib/common/pool.c'), - join_paths(zstd_rootdir, 'lib/common/threading.c'), - join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), - join_paths(zstd_rootdir, 'lib/common/error_private.c')] +poolTests_sources = [join_paths(zstd_rootdir, 'tests/poolTests.c')] poolTests = executable('poolTests', poolTests_sources, include_directories: test_includes, From 8d522b8a9da21edc7b3b85faa4daeb495ff56a85 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Mon, 9 Aug 2021 22:53:15 -0400 Subject: [PATCH 129/472] meson: avoid rebuilding some libzstd sources in the programs These need to be explicitly included as we use their private symbols, but we don't need to recompile them when we can reuse the existing objects. Minus 7 compile steps. --- build/meson/programs/meson.build | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/build/meson/programs/meson.build b/build/meson/programs/meson.build index 0704155d8..55ebf166c 100644 --- a/build/meson/programs/meson.build +++ b/build/meson/programs/meson.build @@ -19,12 +19,7 @@ zstd_programs_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), join_paths(zstd_rootdir, 'programs/benchzstd.c'), join_paths(zstd_rootdir, 'programs/datagen.c'), join_paths(zstd_rootdir, 'programs/dibio.c'), - join_paths(zstd_rootdir, 'programs/zstdcli_trace.c'), - # needed due to use of private symbol + -fvisibility=hidden - join_paths(zstd_rootdir, 'lib/common/xxhash.c'), - join_paths(zstd_rootdir, 'lib/common/pool.c'), - join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), - join_paths(zstd_rootdir, 'lib/common/error_private.c')] + join_paths(zstd_rootdir, 'programs/zstdcli_trace.c')] zstd_deps = [ libzstd_dep ] zstd_c_args = libzstd_debug_cflags @@ -75,6 +70,12 @@ zstd = executable('zstd', zstd_programs_sources, c_args: zstd_c_args, dependencies: zstd_deps, + # needed due to use of private symbol + -fvisibility=hidden + objects: libzstd.extract_objects( + join_paths(zstd_rootdir, 'lib/common/xxhash.c'), + join_paths(zstd_rootdir, 'lib/common/pool.c'), + join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), + join_paths(zstd_rootdir, 'lib/common/error_private.c')), export_dynamic: export_dynamic_on_windows, # Since Meson 0.45.0 install: true) @@ -82,16 +83,18 @@ zstd_frugal_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), join_paths(zstd_rootdir, 'programs/timefn.c'), join_paths(zstd_rootdir, 'programs/util.c'), join_paths(zstd_rootdir, 'programs/fileio.c'), - join_paths(zstd_rootdir, 'programs/fileio_asyncio.c'), - join_paths(zstd_rootdir, 'lib/common/pool.c'), - join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), - join_paths(zstd_rootdir, 'lib/common/error_private.c')] + join_paths(zstd_rootdir, 'programs/fileio_asyncio.c')] # Minimal target, with only zstd compression and decompression. # No bench. No legacy. executable('zstd-frugal', zstd_frugal_sources, dependencies: zstd_frugal_deps, + # needed due to use of private symbol + -fvisibility=hidden + objects: libzstd.extract_objects( + join_paths(zstd_rootdir, 'lib/common/pool.c'), + join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), + join_paths(zstd_rootdir, 'lib/common/error_private.c')), c_args: zstd_frugal_c_args, install: true) From 6548ec7440712eb531f4148ed0568cf90fa1e523 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Thu, 28 Apr 2022 18:22:55 -0400 Subject: [PATCH 130/472] meson: for internal linkage, link to both libzstd and a static copy of it Partial, Meson-only implementation of #2976 for non-MSVC builds. Due to the prevalence of private symbol reuse, linking to a shared library is simply utterly unreliable, but we still want to defer to the shared library for installable applications. By linking to both, we can share symbols where possible, and statically link where needed. This means we no longer need to manually track every file that needs to be extracted and reused. The flip side is that MSVC completely does not support this, so for MSVC builds we just link to a full static copy even where -Ddefault_library=shared. As a side benefit, by using library inclusion rather than including extra explicit object files, the zstd program shrinks in size slightly (~4kb). --- build/meson/lib/meson.build | 29 +++++++++++++++++++++++++++++ build/meson/programs/meson.build | 15 ++------------- build/meson/tests/meson.build | 2 +- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/build/meson/lib/meson.build b/build/meson/lib/meson.build index 2f4126374..467007491 100644 --- a/build/meson/lib/meson.build +++ b/build/meson/lib/meson.build @@ -126,6 +126,35 @@ libzstd = library('zstd', libzstd_dep = declare_dependency(link_with: libzstd, include_directories: libzstd_includes) +# we link to both: +# - the shared library (for public symbols) +# - the static library (for private symbols) +# +# this is needed because internally private symbols are used all the time, and +# -fvisibility=hidden means those cannot be found +if get_option('default_library') == 'static' + libzstd_static = libzstd + libzstd_internal_dep = libzstd_dep +else + if get_option('default_library') == 'shared' + libzstd_static = static_library('zstd_objlib', + objects: libzstd.extract_all_objects(recursive: true), + build_by_default: false) + else + libzstd_static = libzstd.get_static_lib() + endif + + if cc_id == compiler_msvc + # msvc does not actually support linking to both, but errors out with: + # error LNK2005: ZSTD_ already defined in zstd.lib(zstd-1.dll) + libzstd_internal_dep = declare_dependency(link_with: libzstd_static) + else + libzstd_internal_dep = declare_dependency(link_with: libzstd, + # the static library must be linked after the shared one + dependencies: declare_dependency(link_with: libzstd_static)) + endif +endif + pkgconfig.generate(libzstd, name: 'libzstd', filebase: 'libzstd', diff --git a/build/meson/programs/meson.build b/build/meson/programs/meson.build index 55ebf166c..8df3a5dcb 100644 --- a/build/meson/programs/meson.build +++ b/build/meson/programs/meson.build @@ -21,10 +21,10 @@ zstd_programs_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), join_paths(zstd_rootdir, 'programs/dibio.c'), join_paths(zstd_rootdir, 'programs/zstdcli_trace.c')] -zstd_deps = [ libzstd_dep ] +zstd_deps = [ libzstd_internal_dep ] zstd_c_args = libzstd_debug_cflags -zstd_frugal_deps = [ libzstd_dep ] +zstd_frugal_deps = [ libzstd_internal_dep ] zstd_frugal_c_args = [ '-DZSTD_NOBENCH', '-DZSTD_NODICT', '-DZSTD_NOTRACE' ] if use_multi_thread @@ -70,12 +70,6 @@ zstd = executable('zstd', zstd_programs_sources, c_args: zstd_c_args, dependencies: zstd_deps, - # needed due to use of private symbol + -fvisibility=hidden - objects: libzstd.extract_objects( - join_paths(zstd_rootdir, 'lib/common/xxhash.c'), - join_paths(zstd_rootdir, 'lib/common/pool.c'), - join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), - join_paths(zstd_rootdir, 'lib/common/error_private.c')), export_dynamic: export_dynamic_on_windows, # Since Meson 0.45.0 install: true) @@ -90,11 +84,6 @@ zstd_frugal_sources = [join_paths(zstd_rootdir, 'programs/zstdcli.c'), executable('zstd-frugal', zstd_frugal_sources, dependencies: zstd_frugal_deps, - # needed due to use of private symbol + -fvisibility=hidden - objects: libzstd.extract_objects( - join_paths(zstd_rootdir, 'lib/common/pool.c'), - join_paths(zstd_rootdir, 'lib/common/zstd_common.c'), - join_paths(zstd_rootdir, 'lib/common/error_private.c')), c_args: zstd_frugal_c_args, install: true) diff --git a/build/meson/tests/meson.build b/build/meson/tests/meson.build index cf876a395..22f43209a 100644 --- a/build/meson/tests/meson.build +++ b/build/meson/tests/meson.build @@ -38,7 +38,7 @@ testcommon_sources = [join_paths(zstd_rootdir, 'programs/datagen.c'), testcommon = static_library('testcommon', testcommon_sources, # needed due to use of private symbol + -fvisibility=hidden - objects: libzstd.extract_all_objects(recursive: false)) + link_with: libzstd_static) testcommon_dep = declare_dependency(link_with: testcommon, dependencies: libzstd_deps, From 3be9a81e46d7b0672588ecd167ff5ba9cc19a2ec Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 4 May 2022 16:05:37 -0400 Subject: [PATCH 131/472] Update results.csv --- tests/regression/results.csv | 190 +++++++++++++++++------------------ 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/tests/regression/results.csv b/tests/regression/results.csv index 3385c5049..e6a4af271 100644 --- a/tests/regression/results.csv +++ b/tests/regression/results.csv @@ -59,15 +59,15 @@ silesia, uncompressed literals optimal, compress silesia, huffman literals, compress cctx, 6172178 silesia, multithreaded with advanced params, compress cctx, 4842075 github, level -5, compress cctx, 204411 -github, level -5 with dict, compress cctx, 47294 +github, level -5 with dict, compress cctx, 52059 github, level -3, compress cctx, 193253 -github, level -3 with dict, compress cctx, 48047 +github, level -3 with dict, compress cctx, 46787 github, level -1, compress cctx, 175468 -github, level -1 with dict, compress cctx, 43527 +github, level -1 with dict, compress cctx, 43585 github, level 0, compress cctx, 136332 github, level 0 with dict, compress cctx, 41534 github, level 1, compress cctx, 142365 -github, level 1 with dict, compress cctx, 42157 +github, level 1 with dict, compress cctx, 42259 github, level 3, compress cctx, 136332 github, level 3 with dict, compress cctx, 41534 github, level 4, compress cctx, 136199 @@ -188,15 +188,15 @@ github, uncompressed literals optimal, zstdcli, github, huffman literals, zstdcli, 144365 github, multithreaded with advanced params, zstdcli, 167911 github.tar, level -5, zstdcli, 52114 -github.tar, level -5 with dict, zstdcli, 46502 +github.tar, level -5 with dict, zstdcli, 51074 github.tar, level -3, zstdcli, 45682 -github.tar, level -3 with dict, zstdcli, 42181 +github.tar, level -3 with dict, zstdcli, 44660 github.tar, level -1, zstdcli, 42564 -github.tar, level -1 with dict, zstdcli, 41140 +github.tar, level -1 with dict, zstdcli, 41155 github.tar, level 0, zstdcli, 38835 github.tar, level 0 with dict, zstdcli, 37999 github.tar, level 1, zstdcli, 39204 -github.tar, level 1 with dict, zstdcli, 38288 +github.tar, level 1 with dict, zstdcli, 38093 github.tar, level 3, zstdcli, 38835 github.tar, level 3 with dict, zstdcli, 37999 github.tar, level 4, zstdcli, 38897 @@ -312,8 +312,8 @@ github, level 1, advanced github, level 1 with dict, advanced one pass, 41682 github, level 1 with dict dms, advanced one pass, 41682 github, level 1 with dict dds, advanced one pass, 41682 -github, level 1 with dict copy, advanced one pass, 41674 -github, level 1 with dict load, advanced one pass, 43755 +github, level 1 with dict copy, advanced one pass, 41698 +github, level 1 with dict load, advanced one pass, 43814 github, level 3, advanced one pass, 136332 github, level 3 with dict, advanced one pass, 41148 github, level 3 with dict dms, advanced one pass, 41148 @@ -422,11 +422,11 @@ github, uncompressed literals optimal, advanced github, huffman literals, advanced one pass, 142365 github, multithreaded with advanced params, advanced one pass, 165911 github.tar, level -5, advanced one pass, 52110 -github.tar, level -5 with dict, advanced one pass, 46498 +github.tar, level -5 with dict, advanced one pass, 51070 github.tar, level -3, advanced one pass, 45678 -github.tar, level -3 with dict, advanced one pass, 42177 +github.tar, level -3 with dict, advanced one pass, 44656 github.tar, level -1, advanced one pass, 42560 -github.tar, level -1 with dict, advanced one pass, 41136 +github.tar, level -1 with dict, advanced one pass, 41151 github.tar, level 0, advanced one pass, 38831 github.tar, level 0 with dict, advanced one pass, 37995 github.tar, level 0 with dict dms, advanced one pass, 38003 @@ -434,11 +434,11 @@ github.tar, level 0 with dict dds, advanced github.tar, level 0 with dict copy, advanced one pass, 37995 github.tar, level 0 with dict load, advanced one pass, 37956 github.tar, level 1, advanced one pass, 39200 -github.tar, level 1 with dict, advanced one pass, 38284 +github.tar, level 1 with dict, advanced one pass, 38089 github.tar, level 1 with dict dms, advanced one pass, 38294 github.tar, level 1 with dict dds, advanced one pass, 38294 -github.tar, level 1 with dict copy, advanced one pass, 38284 -github.tar, level 1 with dict load, advanced one pass, 38724 +github.tar, level 1 with dict copy, advanced one pass, 38089 +github.tar, level 1 with dict load, advanced one pass, 38364 github.tar, level 3, advanced one pass, 38831 github.tar, level 3 with dict, advanced one pass, 37995 github.tar, level 3 with dict dms, advanced one pass, 38003 @@ -630,8 +630,8 @@ github, level 1, advanced github, level 1 with dict, advanced one pass small out, 41682 github, level 1 with dict dms, advanced one pass small out, 41682 github, level 1 with dict dds, advanced one pass small out, 41682 -github, level 1 with dict copy, advanced one pass small out, 41674 -github, level 1 with dict load, advanced one pass small out, 43755 +github, level 1 with dict copy, advanced one pass small out, 41698 +github, level 1 with dict load, advanced one pass small out, 43814 github, level 3, advanced one pass small out, 136332 github, level 3 with dict, advanced one pass small out, 41148 github, level 3 with dict dms, advanced one pass small out, 41148 @@ -740,11 +740,11 @@ github, uncompressed literals optimal, advanced github, huffman literals, advanced one pass small out, 142365 github, multithreaded with advanced params, advanced one pass small out, 165911 github.tar, level -5, advanced one pass small out, 52110 -github.tar, level -5 with dict, advanced one pass small out, 46498 +github.tar, level -5 with dict, advanced one pass small out, 51070 github.tar, level -3, advanced one pass small out, 45678 -github.tar, level -3 with dict, advanced one pass small out, 42177 +github.tar, level -3 with dict, advanced one pass small out, 44656 github.tar, level -1, advanced one pass small out, 42560 -github.tar, level -1 with dict, advanced one pass small out, 41136 +github.tar, level -1 with dict, advanced one pass small out, 41151 github.tar, level 0, advanced one pass small out, 38831 github.tar, level 0 with dict, advanced one pass small out, 37995 github.tar, level 0 with dict dms, advanced one pass small out, 38003 @@ -752,11 +752,11 @@ github.tar, level 0 with dict dds, advanced github.tar, level 0 with dict copy, advanced one pass small out, 37995 github.tar, level 0 with dict load, advanced one pass small out, 37956 github.tar, level 1, advanced one pass small out, 39200 -github.tar, level 1 with dict, advanced one pass small out, 38284 +github.tar, level 1 with dict, advanced one pass small out, 38089 github.tar, level 1 with dict dms, advanced one pass small out, 38294 github.tar, level 1 with dict dds, advanced one pass small out, 38294 -github.tar, level 1 with dict copy, advanced one pass small out, 38284 -github.tar, level 1 with dict load, advanced one pass small out, 38724 +github.tar, level 1 with dict copy, advanced one pass small out, 38089 +github.tar, level 1 with dict load, advanced one pass small out, 38364 github.tar, level 3, advanced one pass small out, 38831 github.tar, level 3 with dict, advanced one pass small out, 37995 github.tar, level 3 with dict dms, advanced one pass small out, 38003 @@ -864,11 +864,11 @@ github.tar, uncompressed literals, advanced github.tar, uncompressed literals optimal, advanced one pass small out, 35397 github.tar, huffman literals, advanced one pass small out, 38853 github.tar, multithreaded with advanced params, advanced one pass small out, 41525 -silesia, level -5, advanced streaming, 6963781 -silesia, level -3, advanced streaming, 6610376 -silesia, level -1, advanced streaming, 6179294 +silesia, level -5, advanced streaming, 6852424 +silesia, level -3, advanced streaming, 6503413 +silesia, level -1, advanced streaming, 6172179 silesia, level 0, advanced streaming, 4842075 -silesia, level 1, advanced streaming, 5310178 +silesia, level 1, advanced streaming, 5306426 silesia, level 3, advanced streaming, 4842075 silesia, level 4, advanced streaming, 4779186 silesia, level 5 row 1, advanced streaming, 4666323 @@ -896,13 +896,13 @@ silesia, small chain log, advanced silesia, explicit params, advanced streaming, 4795452 silesia, uncompressed literals, advanced streaming, 5120566 silesia, uncompressed literals optimal, advanced streaming, 4319518 -silesia, huffman literals, advanced streaming, 5327881 +silesia, huffman literals, advanced streaming, 5321346 silesia, multithreaded with advanced params, advanced streaming, 5120566 -silesia.tar, level -5, advanced streaming, 7043687 -silesia.tar, level -3, advanced streaming, 6671317 -silesia.tar, level -1, advanced streaming, 6187457 +silesia.tar, level -5, advanced streaming, 6853609 +silesia.tar, level -3, advanced streaming, 6505969 +silesia.tar, level -1, advanced streaming, 6179028 silesia.tar, level 0, advanced streaming, 4859271 -silesia.tar, level 1, advanced streaming, 5333896 +silesia.tar, level 1, advanced streaming, 5327377 silesia.tar, level 3, advanced streaming, 4859271 silesia.tar, level 4, advanced streaming, 4797470 silesia.tar, level 5 row 1, advanced streaming, 4677748 @@ -930,7 +930,7 @@ silesia.tar, small chain log, advanced silesia.tar, explicit params, advanced streaming, 4806873 silesia.tar, uncompressed literals, advanced streaming, 5127423 silesia.tar, uncompressed literals optimal, advanced streaming, 4310141 -silesia.tar, huffman literals, advanced streaming, 5349624 +silesia.tar, huffman literals, advanced streaming, 5341688 silesia.tar, multithreaded with advanced params, advanced streaming, 5122567 github, level -5, advanced streaming, 204411 github, level -5 with dict, advanced streaming, 46718 @@ -948,8 +948,8 @@ github, level 1, advanced github, level 1 with dict, advanced streaming, 41682 github, level 1 with dict dms, advanced streaming, 41682 github, level 1 with dict dds, advanced streaming, 41682 -github, level 1 with dict copy, advanced streaming, 41674 -github, level 1 with dict load, advanced streaming, 43755 +github, level 1 with dict copy, advanced streaming, 41698 +github, level 1 with dict load, advanced streaming, 43814 github, level 3, advanced streaming, 136332 github, level 3 with dict, advanced streaming, 41148 github, level 3 with dict dms, advanced streaming, 41148 @@ -1057,24 +1057,24 @@ github, uncompressed literals, advanced github, uncompressed literals optimal, advanced streaming, 157227 github, huffman literals, advanced streaming, 142365 github, multithreaded with advanced params, advanced streaming, 165911 -github.tar, level -5, advanced streaming, 51420 -github.tar, level -5 with dict, advanced streaming, 45495 -github.tar, level -3, advanced streaming, 45077 -github.tar, level -3 with dict, advanced streaming, 41627 -github.tar, level -1, advanced streaming, 42536 -github.tar, level -1 with dict, advanced streaming, 41198 +github.tar, level -5, advanced streaming, 52110 +github.tar, level -5 with dict, advanced streaming, 51070 +github.tar, level -3, advanced streaming, 45678 +github.tar, level -3 with dict, advanced streaming, 44656 +github.tar, level -1, advanced streaming, 42560 +github.tar, level -1 with dict, advanced streaming, 41151 github.tar, level 0, advanced streaming, 38831 github.tar, level 0 with dict, advanced streaming, 37995 github.tar, level 0 with dict dms, advanced streaming, 38003 github.tar, level 0 with dict dds, advanced streaming, 38003 github.tar, level 0 with dict copy, advanced streaming, 37995 github.tar, level 0 with dict load, advanced streaming, 37956 -github.tar, level 1, advanced streaming, 39270 -github.tar, level 1 with dict, advanced streaming, 38316 -github.tar, level 1 with dict dms, advanced streaming, 38326 -github.tar, level 1 with dict dds, advanced streaming, 38326 -github.tar, level 1 with dict copy, advanced streaming, 38316 -github.tar, level 1 with dict load, advanced streaming, 38761 +github.tar, level 1, advanced streaming, 39200 +github.tar, level 1 with dict, advanced streaming, 38089 +github.tar, level 1 with dict dms, advanced streaming, 38294 +github.tar, level 1 with dict dds, advanced streaming, 38294 +github.tar, level 1 with dict copy, advanced streaming, 38089 +github.tar, level 1 with dict load, advanced streaming, 38364 github.tar, level 3, advanced streaming, 38831 github.tar, level 3 with dict, advanced streaming, 37995 github.tar, level 3 with dict dms, advanced streaming, 38003 @@ -1180,13 +1180,13 @@ github.tar, small chain log, advanced github.tar, explicit params, advanced streaming, 41385 github.tar, uncompressed literals, advanced streaming, 41525 github.tar, uncompressed literals optimal, advanced streaming, 35397 -github.tar, huffman literals, advanced streaming, 38874 +github.tar, huffman literals, advanced streaming, 38853 github.tar, multithreaded with advanced params, advanced streaming, 41525 -silesia, level -5, old streaming, 6963781 -silesia, level -3, old streaming, 6610376 -silesia, level -1, old streaming, 6179294 +silesia, level -5, old streaming, 6852424 +silesia, level -3, old streaming, 6503413 +silesia, level -1, old streaming, 6172179 silesia, level 0, old streaming, 4842075 -silesia, level 1, old streaming, 5310178 +silesia, level 1, old streaming, 5306426 silesia, level 3, old streaming, 4842075 silesia, level 4, old streaming, 4779186 silesia, level 5, old streaming, 4666323 @@ -1199,12 +1199,12 @@ silesia, level 19, old stre silesia, no source size, old streaming, 4842039 silesia, uncompressed literals, old streaming, 4842075 silesia, uncompressed literals optimal, old streaming, 4296686 -silesia, huffman literals, old streaming, 6179294 -silesia.tar, level -5, old streaming, 7043687 -silesia.tar, level -3, old streaming, 6671317 -silesia.tar, level -1, old streaming, 6187457 +silesia, huffman literals, old streaming, 6172179 +silesia.tar, level -5, old streaming, 6853609 +silesia.tar, level -3, old streaming, 6505969 +silesia.tar, level -1, old streaming, 6179028 silesia.tar, level 0, old streaming, 4859271 -silesia.tar, level 1, old streaming, 5333896 +silesia.tar, level 1, old streaming, 5327377 silesia.tar, level 3, old streaming, 4859271 silesia.tar, level 4, old streaming, 4797470 silesia.tar, level 5, old streaming, 4677748 @@ -1217,7 +1217,7 @@ silesia.tar, level 19, old stre silesia.tar, no source size, old streaming, 4859267 silesia.tar, uncompressed literals, old streaming, 4859271 silesia.tar, uncompressed literals optimal, old streaming, 4267266 -silesia.tar, huffman literals, old streaming, 6187457 +silesia.tar, huffman literals, old streaming, 6179028 github, level -5, old streaming, 204411 github, level -5 with dict, old streaming, 46718 github, level -3, old streaming, 193253 @@ -1251,16 +1251,16 @@ github, no source size with dict, old stre github, uncompressed literals, old streaming, 136332 github, uncompressed literals optimal, old streaming, 134064 github, huffman literals, old streaming, 175468 -github.tar, level -5, old streaming, 51420 -github.tar, level -5 with dict, old streaming, 45495 -github.tar, level -3, old streaming, 45077 -github.tar, level -3 with dict, old streaming, 41627 -github.tar, level -1, old streaming, 42536 -github.tar, level -1 with dict, old streaming, 41198 +github.tar, level -5, old streaming, 52110 +github.tar, level -5 with dict, old streaming, 51070 +github.tar, level -3, old streaming, 45678 +github.tar, level -3 with dict, old streaming, 44656 +github.tar, level -1, old streaming, 42560 +github.tar, level -1 with dict, old streaming, 41151 github.tar, level 0, old streaming, 38831 github.tar, level 0 with dict, old streaming, 37995 -github.tar, level 1, old streaming, 39270 -github.tar, level 1 with dict, old streaming, 38316 +github.tar, level 1, old streaming, 39200 +github.tar, level 1 with dict, old streaming, 38089 github.tar, level 3, old streaming, 38831 github.tar, level 3 with dict, old streaming, 37995 github.tar, level 4, old streaming, 38893 @@ -1283,12 +1283,12 @@ github.tar, no source size, old stre github.tar, no source size with dict, old streaming, 38000 github.tar, uncompressed literals, old streaming, 38831 github.tar, uncompressed literals optimal, old streaming, 32134 -github.tar, huffman literals, old streaming, 42536 -silesia, level -5, old streaming advanced, 6963781 -silesia, level -3, old streaming advanced, 6610376 -silesia, level -1, old streaming advanced, 6179294 +github.tar, huffman literals, old streaming, 42560 +silesia, level -5, old streaming advanced, 6852424 +silesia, level -3, old streaming advanced, 6503413 +silesia, level -1, old streaming advanced, 6172179 silesia, level 0, old streaming advanced, 4842075 -silesia, level 1, old streaming advanced, 5310178 +silesia, level 1, old streaming advanced, 5306426 silesia, level 3, old streaming advanced, 4842075 silesia, level 4, old streaming advanced, 4779186 silesia, level 5, old streaming advanced, 4666323 @@ -1308,13 +1308,13 @@ silesia, small chain log, old stre silesia, explicit params, old streaming advanced, 4795452 silesia, uncompressed literals, old streaming advanced, 4842075 silesia, uncompressed literals optimal, old streaming advanced, 4296686 -silesia, huffman literals, old streaming advanced, 6179294 +silesia, huffman literals, old streaming advanced, 6172179 silesia, multithreaded with advanced params, old streaming advanced, 4842075 -silesia.tar, level -5, old streaming advanced, 7043687 -silesia.tar, level -3, old streaming advanced, 6671317 -silesia.tar, level -1, old streaming advanced, 6187457 +silesia.tar, level -5, old streaming advanced, 6853609 +silesia.tar, level -3, old streaming advanced, 6505969 +silesia.tar, level -1, old streaming advanced, 6179028 silesia.tar, level 0, old streaming advanced, 4859271 -silesia.tar, level 1, old streaming advanced, 5333896 +silesia.tar, level 1, old streaming advanced, 5327377 silesia.tar, level 3, old streaming advanced, 4859271 silesia.tar, level 4, old streaming advanced, 4797470 silesia.tar, level 5, old streaming advanced, 4677748 @@ -1334,7 +1334,7 @@ silesia.tar, small chain log, old stre silesia.tar, explicit params, old streaming advanced, 4806873 silesia.tar, uncompressed literals, old streaming advanced, 4859271 silesia.tar, uncompressed literals optimal, old streaming advanced, 4267266 -silesia.tar, huffman literals, old streaming advanced, 6187457 +silesia.tar, huffman literals, old streaming advanced, 6179028 silesia.tar, multithreaded with advanced params, old streaming advanced, 4859271 github, level -5, old streaming advanced, 213265 github, level -5 with dict, old streaming advanced, 49562 @@ -1377,16 +1377,16 @@ github, uncompressed literals, old stre github, uncompressed literals optimal, old streaming advanced, 134064 github, huffman literals, old streaming advanced, 181107 github, multithreaded with advanced params, old streaming advanced, 141104 -github.tar, level -5, old streaming advanced, 51420 -github.tar, level -5 with dict, old streaming advanced, 46091 -github.tar, level -3, old streaming advanced, 45077 -github.tar, level -3 with dict, old streaming advanced, 42222 -github.tar, level -1, old streaming advanced, 42536 -github.tar, level -1 with dict, old streaming advanced, 41494 +github.tar, level -5, old streaming advanced, 52110 +github.tar, level -5 with dict, old streaming advanced, 50985 +github.tar, level -3, old streaming advanced, 45678 +github.tar, level -3 with dict, old streaming advanced, 44729 +github.tar, level -1, old streaming advanced, 42560 +github.tar, level -1 with dict, old streaming advanced, 41589 github.tar, level 0, old streaming advanced, 38831 github.tar, level 0 with dict, old streaming advanced, 38013 -github.tar, level 1, old streaming advanced, 39270 -github.tar, level 1 with dict, old streaming advanced, 38934 +github.tar, level 1, old streaming advanced, 39200 +github.tar, level 1 with dict, old streaming advanced, 38359 github.tar, level 3, old streaming advanced, 38831 github.tar, level 3 with dict, old streaming advanced, 38013 github.tar, level 4, old streaming advanced, 38893 @@ -1416,7 +1416,7 @@ github.tar, small chain log, old stre github.tar, explicit params, old streaming advanced, 41385 github.tar, uncompressed literals, old streaming advanced, 38831 github.tar, uncompressed literals optimal, old streaming advanced, 32134 -github.tar, huffman literals, old streaming advanced, 42536 +github.tar, huffman literals, old streaming advanced, 42560 github.tar, multithreaded with advanced params, old streaming advanced, 38831 github, level -5 with dict, old streaming cdict, 46718 github, level -3 with dict, old streaming cdict, 45395 @@ -1433,11 +1433,11 @@ github, level 13 with dict, old stre github, level 16 with dict, old streaming cdict, 37577 github, level 19 with dict, old streaming cdict, 37576 github, no source size with dict, old streaming cdict, 40654 -github.tar, level -5 with dict, old streaming cdict, 46276 -github.tar, level -3 with dict, old streaming cdict, 42354 -github.tar, level -1 with dict, old streaming cdict, 41662 +github.tar, level -5 with dict, old streaming cdict, 51189 +github.tar, level -3 with dict, old streaming cdict, 44821 +github.tar, level -1 with dict, old streaming cdict, 41775 github.tar, level 0 with dict, old streaming cdict, 37956 -github.tar, level 1 with dict, old streaming cdict, 38761 +github.tar, level 1 with dict, old streaming cdict, 38364 github.tar, level 3 with dict, old streaming cdict, 37956 github.tar, level 4 with dict, old streaming cdict, 37927 github.tar, level 5 with dict, old streaming cdict, 38999 @@ -1463,11 +1463,11 @@ github, level 13 with dict, old stre github, level 16 with dict, old streaming advanced cdict, 40789 github, level 19 with dict, old streaming advanced cdict, 37576 github, no source size with dict, old streaming advanced cdict, 40608 -github.tar, level -5 with dict, old streaming advanced cdict, 44307 -github.tar, level -3 with dict, old streaming advanced cdict, 41359 -github.tar, level -1 with dict, old streaming advanced cdict, 41322 +github.tar, level -5 with dict, old streaming advanced cdict, 50854 +github.tar, level -3 with dict, old streaming advanced cdict, 44571 +github.tar, level -1 with dict, old streaming advanced cdict, 41477 github.tar, level 0 with dict, old streaming advanced cdict, 38013 -github.tar, level 1 with dict, old streaming advanced cdict, 39002 +github.tar, level 1 with dict, old streaming advanced cdict, 38168 github.tar, level 3 with dict, old streaming advanced cdict, 38013 github.tar, level 4 with dict, old streaming advanced cdict, 38063 github.tar, level 5 with dict, old streaming advanced cdict, 38997 From 83049cb3fe980f529bf595bd819252ee2b6667de Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Mon, 9 May 2022 18:28:03 -0400 Subject: [PATCH 132/472] Unbreak FreeBSD CI --- .cirrus.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.cirrus.yml b/.cirrus.yml index fe17aacea..27ca65e8d 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,9 +2,8 @@ task: name: FreeBSD (shortest) freebsd_instance: matrix: + image_family: freebsd-13-0 image_family: freebsd-12-2 - # The stable 11.3 image causes "Agent is not responding" so use a snapshot - image_family: freebsd-11-3-snap install_script: pkg install -y gmake coreutils script: | MOREFLAGS="-Werror" gmake -j all From 97aabc496e57821cb46893bd0a73f48ff6bc20b7 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Mon, 9 May 2022 17:17:11 -0400 Subject: [PATCH 133/472] Correct and clarify repcode offset history logic --- lib/compress/zstd_double_fast.c | 19 +++++++++++-------- lib/compress/zstd_fast.c | 32 ++++++++++++++++++++------------ lib/compress/zstd_lazy.c | 17 +++++++++++------ 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/lib/compress/zstd_double_fast.c b/lib/compress/zstd_double_fast.c index 610a1b3ec..d619f119b 100644 --- a/lib/compress/zstd_double_fast.c +++ b/lib/compress/zstd_double_fast.c @@ -67,7 +67,7 @@ size_t ZSTD_compressBlock_doubleFast_noDict_generic( const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - HASH_READ_SIZE; U32 offset_1=rep[0], offset_2=rep[1]; - U32 offsetSaved = 0; + U32 offsetSaved1 = 0, offsetSaved2 = 0; size_t mLength; U32 offset; @@ -100,8 +100,8 @@ size_t ZSTD_compressBlock_doubleFast_noDict_generic( U32 const current = (U32)(ip - base); U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, current, cParams->windowLog); U32 const maxRep = current - windowLow; - if (offset_2 > maxRep) offsetSaved = offset_2, offset_2 = 0; - if (offset_1 > maxRep) offsetSaved = offset_1, offset_1 = 0; + if (offset_2 > maxRep) offsetSaved2 = offset_2, offset_2 = 0; + if (offset_1 > maxRep) offsetSaved1 = offset_1, offset_1 = 0; } /* Outer Loop: one iteration per match found and stored */ @@ -175,9 +175,13 @@ size_t ZSTD_compressBlock_doubleFast_noDict_generic( } while (ip1 <= ilimit); _cleanup: + /* If rep_offset1 started invalid (offsetSaved1 > 0) and became valid (rep_offset1 > 0), + * rotate saved offsets. */ + offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; + /* save reps for next block */ - rep[0] = offset_1 ? offset_1 : offsetSaved; - rep[1] = offset_2 ? offset_2 : offsetSaved; + rep[0] = offset_1 ? offset_1 : offsetSaved1; + rep[1] = offset_2 ? offset_2 : offsetSaved2; /* Return the last literals size */ return (size_t)(iend - anchor); @@ -275,7 +279,6 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - HASH_READ_SIZE; U32 offset_1=rep[0], offset_2=rep[1]; - U32 offsetSaved = 0; const ZSTD_matchState_t* const dms = ms->dictMatchState; const ZSTD_compressionParameters* const dictCParams = &dms->cParams; @@ -461,8 +464,8 @@ _match_stored: } /* while (ip < ilimit) */ /* save reps for next block */ - rep[0] = offset_1 ? offset_1 : offsetSaved; - rep[1] = offset_2 ? offset_2 : offsetSaved; + rep[0] = offset_1; + rep[1] = offset_2; /* Return the last literals size */ return (size_t)(iend - anchor); diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 198ccaee3..36ea4f4e1 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -117,7 +117,7 @@ ZSTD_compressBlock_fast_noDict_generic( U32 rep_offset1 = rep[0]; U32 rep_offset2 = rep[1]; - U32 offsetSaved = 0; + U32 offsetSaved1 = 0, offsetSaved2 = 0; size_t hash0; /* hash for ip0 */ size_t hash1; /* hash for ip1 */ @@ -141,8 +141,8 @@ ZSTD_compressBlock_fast_noDict_generic( { U32 const curr = (U32)(ip0 - base); U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, cParams->windowLog); U32 const maxRep = curr - windowLow; - if (rep_offset2 > maxRep) offsetSaved = rep_offset2, rep_offset2 = 0; - if (rep_offset1 > maxRep) offsetSaved = rep_offset1, rep_offset1 = 0; + if (rep_offset2 > maxRep) offsetSaved2 = rep_offset2, rep_offset2 = 0; + if (rep_offset1 > maxRep) offsetSaved1 = rep_offset1, rep_offset1 = 0; } /* start each op */ @@ -254,9 +254,13 @@ _cleanup: * However, it seems to be a meaningful performance hit to try to search * them. So let's not. */ + /* If rep_offset1 started invalid (offsetSaved1 != 0) and became valid (rep_offset1 != 0), + * rotate saved offsets. */ + offsetSaved2 = ((offsetSaved1 > 0) & (rep_offset1 > 0)) ? offsetSaved1 : offsetSaved2; + /* save reps for next block */ - rep[0] = rep_offset1 ? rep_offset1 : offsetSaved; - rep[1] = rep_offset2 ? rep_offset2 : offsetSaved; + rep[0] = rep_offset1 ? rep_offset1 : offsetSaved1; + rep[1] = rep_offset2 ? rep_offset2 : offsetSaved2; /* Return the last literals size */ return (size_t)(iend - anchor); @@ -388,7 +392,6 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - HASH_READ_SIZE; U32 offset_1=rep[0], offset_2=rep[1]; - U32 offsetSaved = 0; const ZSTD_matchState_t* const dms = ms->dictMatchState; const ZSTD_compressionParameters* const dictCParams = &dms->cParams ; @@ -545,8 +548,8 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( _cleanup: /* save reps for next block */ - rep[0] = offset_1 ? offset_1 : offsetSaved; - rep[1] = offset_2 ? offset_2 : offsetSaved; + rep[0] = offset_1; + rep[1] = offset_2; /* Return the last literals size */ return (size_t)(iend - anchor); @@ -603,6 +606,7 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - 8; U32 offset_1=rep[0], offset_2=rep[1]; + U32 offsetSaved1 = 0, offsetSaved2 = 0; const BYTE* ip0 = istart; const BYTE* ip1; @@ -635,8 +639,8 @@ static size_t ZSTD_compressBlock_fast_extDict_generic( { U32 const curr = (U32)(ip0 - base); U32 const maxRep = curr - dictStartIndex; - if (offset_2 >= maxRep) offset_2 = 0; - if (offset_1 >= maxRep) offset_1 = 0; + if (offset_2 >= maxRep) offsetSaved2 = offset_2, offset_2 = 0; + if (offset_1 >= maxRep) offsetSaved1 = offset_1, offset_1 = 0; } /* start each op */ @@ -758,9 +762,13 @@ _cleanup: * However, it seems to be a meaningful performance hit to try to search * them. So let's not. */ + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. */ + offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; + /* save reps for next block */ - rep[0] = offset_1 ? offset_1 : rep[0]; - rep[1] = offset_2 ? offset_2 : rep[1]; + rep[0] = offset_1 ? offset_1 : offsetSaved1; + rep[1] = offset_2 ? offset_2 : offsetSaved2; /* Return the last literals size */ return (size_t)(iend - anchor); diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 7f97e12a5..9814943d1 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -1461,7 +1461,8 @@ ZSTD_compressBlock_lazy_generic( const BYTE* const prefixLowest = base + prefixLowestIndex; searchMax_f const searchMax = ZSTD_selectLazyVTable(ms, searchMethod, dictMode)->searchMax; - U32 offset_1 = rep[0], offset_2 = rep[1], savedOffset=0; + U32 offset_1 = rep[0], offset_2 = rep[1]; + U32 offsetSaved1 = 0, offsetSaved2 = 0; const int isDMS = dictMode == ZSTD_dictMatchState; const int isDDS = dictMode == ZSTD_dedicatedDictSearch; @@ -1484,8 +1485,8 @@ ZSTD_compressBlock_lazy_generic( U32 const curr = (U32)(ip - base); U32 const windowLow = ZSTD_getLowestPrefixIndex(ms, curr, ms->cParams.windowLog); U32 const maxRep = curr - windowLow; - if (offset_2 > maxRep) savedOffset = offset_2, offset_2 = 0; - if (offset_1 > maxRep) savedOffset = offset_1, offset_1 = 0; + if (offset_2 > maxRep) offsetSaved2 = offset_2, offset_2 = 0; + if (offset_1 > maxRep) offsetSaved1 = offset_1, offset_1 = 0; } if (isDxS) { /* dictMatchState repCode checks don't currently handle repCode == 0 @@ -1681,9 +1682,13 @@ _storeSequence: continue; /* faster when present ... (?) */ } } } - /* Save reps for next block */ - rep[0] = offset_1 ? offset_1 : savedOffset; - rep[1] = offset_2 ? offset_2 : savedOffset; + /* If offset_1 started invalid (offsetSaved1 > 0) and became valid (offset_1 > 0), + * rotate saved offsets. */ + offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; + + /* save reps for next block */ + rep[0] = offset_1 ? offset_1 : offsetSaved1; + rep[1] = offset_2 ? offset_2 : offsetSaved2; /* Return the last literals size */ return (size_t)(iend - anchor); From 22875ece616624215ecb86211c4256c39a710a82 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Mon, 9 May 2022 18:26:10 -0400 Subject: [PATCH 134/472] Nits --- lib/compress/zstd_double_fast.c | 2 +- lib/compress/zstd_fast.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/compress/zstd_double_fast.c b/lib/compress/zstd_double_fast.c index d619f119b..698a97a80 100644 --- a/lib/compress/zstd_double_fast.c +++ b/lib/compress/zstd_double_fast.c @@ -175,7 +175,7 @@ size_t ZSTD_compressBlock_doubleFast_noDict_generic( } while (ip1 <= ilimit); _cleanup: - /* If rep_offset1 started invalid (offsetSaved1 > 0) and became valid (rep_offset1 > 0), + /* If offset_1 started invalid (offsetSaved1 > 0) and became valid (offset_1 > 0), * rotate saved offsets. */ offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 36ea4f4e1..3d3b7d9cb 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -254,7 +254,7 @@ _cleanup: * However, it seems to be a meaningful performance hit to try to search * them. So let's not. */ - /* If rep_offset1 started invalid (offsetSaved1 != 0) and became valid (rep_offset1 != 0), + /* If rep_offset1 started invalid (offsetSaved1 > 0) and became valid (rep_offset1 > 0), * rotate saved offsets. */ offsetSaved2 = ((offsetSaved1 > 0) & (rep_offset1 > 0)) ? offsetSaved1 : offsetSaved2; @@ -762,7 +762,7 @@ _cleanup: * However, it seems to be a meaningful performance hit to try to search * them. So let's not. */ - /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + /* If offset_1 started invalid (offsetSaved1 > 0) and became valid (offset_1 > 0), * rotate saved offsets. */ offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; From 040986a4f4a2ba64a3ad9dc76646d8fab4472b37 Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Tue, 10 May 2022 14:29:39 -0700 Subject: [PATCH 135/472] ZSTD_fast_noDict: Minimize Checks When Writing Hash Table for ip1 This commit avoids checking whether a hashtable write is safe in two of the three match-found paths in `ZSTD_compressBlock_fast_noDict_generic`. This pro- duces a ~0.5% speed-up in compression. A comment in the code describes why we can skip this check in the other two paths (the repcode check and the first match check in the unrolled loop). A downside is that in the new position where we make this check, we have not yet computed `mLength`. We therefore have to avoid writing *possibly* dangerous positions, rather than the old check which only avoids writing *actually* dangerous positions. This leads to a miniscule loss in ratio (remember that this scenario can only been triggered in very negative levels or under incomp- ressibility acceleration). --- lib/compress/zstd_fast.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 198ccaee3..f2028ef35 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -224,6 +224,23 @@ _start: /* Requires: ip0 */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { /* found a match! */ + if (step > 4) { + /* We need to avoid writing an index into the hash table >= the + * position at which we will pick up our searching after we've + * taken this match. + * + * The minimum possible match has length 4, so the earliest ip0 + * can be after we take this match will be the current ip0 + 4. + * ip1 is ip0 + step - 1. If ip1 is >= ip0 + 4, we can't safely + * write this position. The expedient thing to do is just to + * write a bad position. + * + * We perform this check here, separate from the write, because + * this is the only match path where this can occur. (In rep- + * code and the first match checks, ip1 == ip0 + 1.) + */ + ip1 = base; + } goto _offset; } @@ -288,9 +305,7 @@ _match: /* Requires: ip0, match0, offcode */ anchor = ip0; /* write next hash table entry */ - if (ip1 < ip0) { - hashTable[hash1] = (U32)(ip1 - base); - } + hashTable[hash1] = (U32)(ip1 - base); /* Fill table and check for immediate repcode. */ if (ip0 <= ilimit) { From cd1f5829432c6df1a47c26cf9be75495fb2fdb94 Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Wed, 11 May 2022 11:27:34 -0400 Subject: [PATCH 136/472] Hoist Hash Table Writes Up into Each Match Found Block Refactoring this way avoids the bad write in the case that `step > 4`, and is a bit more straightforward. It also seems to perform better! --- lib/compress/zstd_fast.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index f2028ef35..11c80af87 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -182,6 +182,10 @@ _start: /* Requires: ip0 */ match0 -= mLength; offcode = REPCODE1_TO_OFFBASE; mLength += 4; + + /* first write next hash table entry; we've already calculated it */ + hashTable[hash1] = (U32)(ip1 - base); + goto _match; } @@ -195,6 +199,10 @@ _start: /* Requires: ip0 */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { /* found a match! */ + + /* first write next hash table entry; we've already calculated it */ + hashTable[hash1] = (U32)(ip1 - base); + goto _offset; } @@ -224,7 +232,9 @@ _start: /* Requires: ip0 */ /* check match at ip[0] */ if (MEM_read32(ip0) == mval) { /* found a match! */ - if (step > 4) { + + /* first write next hash table entry; we've already calculated it */ + if (step <= 4) { /* We need to avoid writing an index into the hash table >= the * position at which we will pick up our searching after we've * taken this match. @@ -239,8 +249,9 @@ _start: /* Requires: ip0 */ * this is the only match path where this can occur. (In rep- * code and the first match checks, ip1 == ip0 + 1.) */ - ip1 = base; + hashTable[hash1] = (U32)(ip1 - base); } + goto _offset; } @@ -304,9 +315,6 @@ _match: /* Requires: ip0, match0, offcode */ ip0 += mLength; anchor = ip0; - /* write next hash table entry */ - hashTable[hash1] = (U32)(ip1 - base); - /* Fill table and check for immediate repcode. */ if (ip0 <= ilimit) { /* Fill Table */ From 1dd046a50783ebc4d0eb10928e71b2dd7c71cd4c Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Wed, 11 May 2022 12:38:20 -0400 Subject: [PATCH 137/472] Fix Comments Slightly --- lib/compress/zstd_fast.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 11c80af87..f51911eb9 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -183,7 +183,9 @@ _start: /* Requires: ip0 */ offcode = REPCODE1_TO_OFFBASE; mLength += 4; - /* first write next hash table entry; we've already calculated it */ + /* First write next hash table entry; we've already calculated it. + * This write is known to be safe because the ip1 is before the + * repcode (ip2). */ hashTable[hash1] = (U32)(ip1 - base); goto _match; @@ -200,7 +202,9 @@ _start: /* Requires: ip0 */ if (MEM_read32(ip0) == mval) { /* found a match! */ - /* first write next hash table entry; we've already calculated it */ + /* First write next hash table entry; we've already calculated it. + * This write is known to be safe because the ip1 == ip0 + 1, so + * we know we will resume searching after ip1 */ hashTable[hash1] = (U32)(ip1 - base); goto _offset; @@ -242,12 +246,7 @@ _start: /* Requires: ip0 */ * The minimum possible match has length 4, so the earliest ip0 * can be after we take this match will be the current ip0 + 4. * ip1 is ip0 + step - 1. If ip1 is >= ip0 + 4, we can't safely - * write this position. The expedient thing to do is just to - * write a bad position. - * - * We perform this check here, separate from the write, because - * this is the only match path where this can occur. (In rep- - * code and the first match checks, ip1 == ip0 + 1.) + * write this position. */ hashTable[hash1] = (U32)(ip1 - base); } From 1bc8019e10a8ec4c7c1ad3dc2abf9355a1add1f4 Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Wed, 11 May 2022 10:27:35 -0700 Subject: [PATCH 138/472] Update results.csv --- tests/regression/results.csv | 180 +++++++++++++++++------------------ 1 file changed, 90 insertions(+), 90 deletions(-) diff --git a/tests/regression/results.csv b/tests/regression/results.csv index e6a4af271..73069c5d6 100644 --- a/tests/regression/results.csv +++ b/tests/regression/results.csv @@ -1,9 +1,9 @@ Data, Config, Method, Total compressed size -silesia.tar, level -5, compress simple, 6853608 -silesia.tar, level -3, compress simple, 6505969 -silesia.tar, level -1, compress simple, 6179026 +silesia.tar, level -5, compress simple, 6861055 +silesia.tar, level -3, compress simple, 6505483 +silesia.tar, level -1, compress simple, 6179047 silesia.tar, level 0, compress simple, 4854086 -silesia.tar, level 1, compress simple, 5327373 +silesia.tar, level 1, compress simple, 5327717 silesia.tar, level 3, compress simple, 4854086 silesia.tar, level 4, compress simple, 4791503 silesia.tar, level 5, compress simple, 4677740 @@ -15,8 +15,8 @@ silesia.tar, level 16, compress silesia.tar, level 19, compress simple, 4267266 silesia.tar, uncompressed literals, compress simple, 4854086 silesia.tar, uncompressed literals optimal, compress simple, 4267266 -silesia.tar, huffman literals, compress simple, 6179026 -github.tar, level -5, compress simple, 52110 +silesia.tar, huffman literals, compress simple, 6179047 +github.tar, level -5, compress simple, 52115 github.tar, level -3, compress simple, 45678 github.tar, level -1, compress simple, 42560 github.tar, level 0, compress simple, 38831 @@ -33,11 +33,11 @@ github.tar, level 19, compress github.tar, uncompressed literals, compress simple, 38831 github.tar, uncompressed literals optimal, compress simple, 32134 github.tar, huffman literals, compress simple, 42560 -silesia, level -5, compress cctx, 6852424 -silesia, level -3, compress cctx, 6503413 -silesia, level -1, compress cctx, 6172178 +silesia, level -5, compress cctx, 6857372 +silesia, level -3, compress cctx, 6503412 +silesia, level -1, compress cctx, 6172202 silesia, level 0, compress cctx, 4842075 -silesia, level 1, compress cctx, 5306426 +silesia, level 1, compress cctx, 5306632 silesia, level 3, compress cctx, 4842075 silesia, level 4, compress cctx, 4779186 silesia, level 5, compress cctx, 4666323 @@ -56,9 +56,9 @@ silesia, small chain log, compress silesia, explicit params, compress cctx, 4794052 silesia, uncompressed literals, compress cctx, 4842075 silesia, uncompressed literals optimal, compress cctx, 4296686 -silesia, huffman literals, compress cctx, 6172178 +silesia, huffman literals, compress cctx, 6172202 silesia, multithreaded with advanced params, compress cctx, 4842075 -github, level -5, compress cctx, 204411 +github, level -5, compress cctx, 204407 github, level -5 with dict, compress cctx, 52059 github, level -3, compress cctx, 193253 github, level -3 with dict, compress cctx, 46787 @@ -97,11 +97,11 @@ github, uncompressed literals, compress github, uncompressed literals optimal, compress cctx, 134064 github, huffman literals, compress cctx, 175468 github, multithreaded with advanced params, compress cctx, 141069 -silesia, level -5, zstdcli, 6852472 -silesia, level -3, zstdcli, 6503461 -silesia, level -1, zstdcli, 6172226 +silesia, level -5, zstdcli, 6857420 +silesia, level -3, zstdcli, 6503460 +silesia, level -1, zstdcli, 6172250 silesia, level 0, zstdcli, 4842123 -silesia, level 1, zstdcli, 5306474 +silesia, level 1, zstdcli, 5306680 silesia, level 3, zstdcli, 4842123 silesia, level 4, zstdcli, 4779234 silesia, level 5, zstdcli, 4666371 @@ -120,13 +120,13 @@ silesia, small chain log, zstdcli, silesia, explicit params, zstdcli, 4795432 silesia, uncompressed literals, zstdcli, 5120614 silesia, uncompressed literals optimal, zstdcli, 4319566 -silesia, huffman literals, zstdcli, 5321394 +silesia, huffman literals, zstdcli, 5321417 silesia, multithreaded with advanced params, zstdcli, 5120614 -silesia.tar, level -5, zstdcli, 6853994 -silesia.tar, level -3, zstdcli, 6506742 -silesia.tar, level -1, zstdcli, 6179765 +silesia.tar, level -5, zstdcli, 6862049 +silesia.tar, level -3, zstdcli, 6506509 +silesia.tar, level -1, zstdcli, 6179789 silesia.tar, level 0, zstdcli, 4854164 -silesia.tar, level 1, zstdcli, 5328534 +silesia.tar, level 1, zstdcli, 5329010 silesia.tar, level 3, zstdcli, 4854164 silesia.tar, level 4, zstdcli, 4792352 silesia.tar, level 5, zstdcli, 4678682 @@ -146,9 +146,9 @@ silesia.tar, small chain log, zstdcli, silesia.tar, explicit params, zstdcli, 4820713 silesia.tar, uncompressed literals, zstdcli, 5122571 silesia.tar, uncompressed literals optimal, zstdcli, 4310145 -silesia.tar, huffman literals, zstdcli, 5342054 +silesia.tar, huffman literals, zstdcli, 5342074 silesia.tar, multithreaded with advanced params, zstdcli, 5122571 -github, level -5, zstdcli, 206411 +github, level -5, zstdcli, 206407 github, level -5 with dict, zstdcli, 48718 github, level -3, zstdcli, 195253 github, level -3 with dict, zstdcli, 47395 @@ -187,8 +187,8 @@ github, uncompressed literals, zstdcli, github, uncompressed literals optimal, zstdcli, 159227 github, huffman literals, zstdcli, 144365 github, multithreaded with advanced params, zstdcli, 167911 -github.tar, level -5, zstdcli, 52114 -github.tar, level -5 with dict, zstdcli, 51074 +github.tar, level -5, zstdcli, 52119 +github.tar, level -5 with dict, zstdcli, 50978 github.tar, level -3, zstdcli, 45682 github.tar, level -3 with dict, zstdcli, 44660 github.tar, level -1, zstdcli, 42564 @@ -228,11 +228,11 @@ github.tar, uncompressed literals, zstdcli, github.tar, uncompressed literals optimal, zstdcli, 35401 github.tar, huffman literals, zstdcli, 38857 github.tar, multithreaded with advanced params, zstdcli, 41529 -silesia, level -5, advanced one pass, 6852424 -silesia, level -3, advanced one pass, 6503413 -silesia, level -1, advanced one pass, 6172178 +silesia, level -5, advanced one pass, 6857372 +silesia, level -3, advanced one pass, 6503412 +silesia, level -1, advanced one pass, 6172202 silesia, level 0, advanced one pass, 4842075 -silesia, level 1, advanced one pass, 5306426 +silesia, level 1, advanced one pass, 5306632 silesia, level 3, advanced one pass, 4842075 silesia, level 4, advanced one pass, 4779186 silesia, level 5 row 1, advanced one pass, 4666323 @@ -260,13 +260,13 @@ silesia, small chain log, advanced silesia, explicit params, advanced one pass, 4795432 silesia, uncompressed literals, advanced one pass, 5120566 silesia, uncompressed literals optimal, advanced one pass, 4319518 -silesia, huffman literals, advanced one pass, 5321346 +silesia, huffman literals, advanced one pass, 5321369 silesia, multithreaded with advanced params, advanced one pass, 5120566 -silesia.tar, level -5, advanced one pass, 6853608 -silesia.tar, level -3, advanced one pass, 6505969 -silesia.tar, level -1, advanced one pass, 6179026 +silesia.tar, level -5, advanced one pass, 6861055 +silesia.tar, level -3, advanced one pass, 6505483 +silesia.tar, level -1, advanced one pass, 6179047 silesia.tar, level 0, advanced one pass, 4854086 -silesia.tar, level 1, advanced one pass, 5327373 +silesia.tar, level 1, advanced one pass, 5327717 silesia.tar, level 3, advanced one pass, 4854086 silesia.tar, level 4, advanced one pass, 4791503 silesia.tar, level 5 row 1, advanced one pass, 4677740 @@ -294,9 +294,9 @@ silesia.tar, small chain log, advanced silesia.tar, explicit params, advanced one pass, 4806855 silesia.tar, uncompressed literals, advanced one pass, 5122473 silesia.tar, uncompressed literals optimal, advanced one pass, 4310141 -silesia.tar, huffman literals, advanced one pass, 5341685 +silesia.tar, huffman literals, advanced one pass, 5341705 silesia.tar, multithreaded with advanced params, advanced one pass, 5122567 -github, level -5, advanced one pass, 204411 +github, level -5, advanced one pass, 204407 github, level -5 with dict, advanced one pass, 46718 github, level -3, advanced one pass, 193253 github, level -3 with dict, advanced one pass, 45395 @@ -421,8 +421,8 @@ github, uncompressed literals, advanced github, uncompressed literals optimal, advanced one pass, 157227 github, huffman literals, advanced one pass, 142365 github, multithreaded with advanced params, advanced one pass, 165911 -github.tar, level -5, advanced one pass, 52110 -github.tar, level -5 with dict, advanced one pass, 51070 +github.tar, level -5, advanced one pass, 52115 +github.tar, level -5 with dict, advanced one pass, 50974 github.tar, level -3, advanced one pass, 45678 github.tar, level -3 with dict, advanced one pass, 44656 github.tar, level -1, advanced one pass, 42560 @@ -546,11 +546,11 @@ github.tar, uncompressed literals, advanced github.tar, uncompressed literals optimal, advanced one pass, 35397 github.tar, huffman literals, advanced one pass, 38853 github.tar, multithreaded with advanced params, advanced one pass, 41525 -silesia, level -5, advanced one pass small out, 6852424 -silesia, level -3, advanced one pass small out, 6503413 -silesia, level -1, advanced one pass small out, 6172178 +silesia, level -5, advanced one pass small out, 6857372 +silesia, level -3, advanced one pass small out, 6503412 +silesia, level -1, advanced one pass small out, 6172202 silesia, level 0, advanced one pass small out, 4842075 -silesia, level 1, advanced one pass small out, 5306426 +silesia, level 1, advanced one pass small out, 5306632 silesia, level 3, advanced one pass small out, 4842075 silesia, level 4, advanced one pass small out, 4779186 silesia, level 5 row 1, advanced one pass small out, 4666323 @@ -578,13 +578,13 @@ silesia, small chain log, advanced silesia, explicit params, advanced one pass small out, 4795432 silesia, uncompressed literals, advanced one pass small out, 5120566 silesia, uncompressed literals optimal, advanced one pass small out, 4319518 -silesia, huffman literals, advanced one pass small out, 5321346 +silesia, huffman literals, advanced one pass small out, 5321369 silesia, multithreaded with advanced params, advanced one pass small out, 5120566 -silesia.tar, level -5, advanced one pass small out, 6853608 -silesia.tar, level -3, advanced one pass small out, 6505969 -silesia.tar, level -1, advanced one pass small out, 6179026 +silesia.tar, level -5, advanced one pass small out, 6861055 +silesia.tar, level -3, advanced one pass small out, 6505483 +silesia.tar, level -1, advanced one pass small out, 6179047 silesia.tar, level 0, advanced one pass small out, 4854086 -silesia.tar, level 1, advanced one pass small out, 5327373 +silesia.tar, level 1, advanced one pass small out, 5327717 silesia.tar, level 3, advanced one pass small out, 4854086 silesia.tar, level 4, advanced one pass small out, 4791503 silesia.tar, level 5 row 1, advanced one pass small out, 4677740 @@ -612,9 +612,9 @@ silesia.tar, small chain log, advanced silesia.tar, explicit params, advanced one pass small out, 4806855 silesia.tar, uncompressed literals, advanced one pass small out, 5122473 silesia.tar, uncompressed literals optimal, advanced one pass small out, 4310141 -silesia.tar, huffman literals, advanced one pass small out, 5341685 +silesia.tar, huffman literals, advanced one pass small out, 5341705 silesia.tar, multithreaded with advanced params, advanced one pass small out, 5122567 -github, level -5, advanced one pass small out, 204411 +github, level -5, advanced one pass small out, 204407 github, level -5 with dict, advanced one pass small out, 46718 github, level -3, advanced one pass small out, 193253 github, level -3 with dict, advanced one pass small out, 45395 @@ -739,8 +739,8 @@ github, uncompressed literals, advanced github, uncompressed literals optimal, advanced one pass small out, 157227 github, huffman literals, advanced one pass small out, 142365 github, multithreaded with advanced params, advanced one pass small out, 165911 -github.tar, level -5, advanced one pass small out, 52110 -github.tar, level -5 with dict, advanced one pass small out, 51070 +github.tar, level -5, advanced one pass small out, 52115 +github.tar, level -5 with dict, advanced one pass small out, 50974 github.tar, level -3, advanced one pass small out, 45678 github.tar, level -3 with dict, advanced one pass small out, 44656 github.tar, level -1, advanced one pass small out, 42560 @@ -864,11 +864,11 @@ github.tar, uncompressed literals, advanced github.tar, uncompressed literals optimal, advanced one pass small out, 35397 github.tar, huffman literals, advanced one pass small out, 38853 github.tar, multithreaded with advanced params, advanced one pass small out, 41525 -silesia, level -5, advanced streaming, 6852424 -silesia, level -3, advanced streaming, 6503413 -silesia, level -1, advanced streaming, 6172179 +silesia, level -5, advanced streaming, 6854744 +silesia, level -3, advanced streaming, 6503319 +silesia, level -1, advanced streaming, 6172207 silesia, level 0, advanced streaming, 4842075 -silesia, level 1, advanced streaming, 5306426 +silesia, level 1, advanced streaming, 5306388 silesia, level 3, advanced streaming, 4842075 silesia, level 4, advanced streaming, 4779186 silesia, level 5 row 1, advanced streaming, 4666323 @@ -896,13 +896,13 @@ silesia, small chain log, advanced silesia, explicit params, advanced streaming, 4795452 silesia, uncompressed literals, advanced streaming, 5120566 silesia, uncompressed literals optimal, advanced streaming, 4319518 -silesia, huffman literals, advanced streaming, 5321346 +silesia, huffman literals, advanced streaming, 5321370 silesia, multithreaded with advanced params, advanced streaming, 5120566 -silesia.tar, level -5, advanced streaming, 6853609 -silesia.tar, level -3, advanced streaming, 6505969 -silesia.tar, level -1, advanced streaming, 6179028 +silesia.tar, level -5, advanced streaming, 6856523 +silesia.tar, level -3, advanced streaming, 6505954 +silesia.tar, level -1, advanced streaming, 6179056 silesia.tar, level 0, advanced streaming, 4859271 -silesia.tar, level 1, advanced streaming, 5327377 +silesia.tar, level 1, advanced streaming, 5327708 silesia.tar, level 3, advanced streaming, 4859271 silesia.tar, level 4, advanced streaming, 4797470 silesia.tar, level 5 row 1, advanced streaming, 4677748 @@ -930,9 +930,9 @@ silesia.tar, small chain log, advanced silesia.tar, explicit params, advanced streaming, 4806873 silesia.tar, uncompressed literals, advanced streaming, 5127423 silesia.tar, uncompressed literals optimal, advanced streaming, 4310141 -silesia.tar, huffman literals, advanced streaming, 5341688 +silesia.tar, huffman literals, advanced streaming, 5341712 silesia.tar, multithreaded with advanced params, advanced streaming, 5122567 -github, level -5, advanced streaming, 204411 +github, level -5, advanced streaming, 204407 github, level -5 with dict, advanced streaming, 46718 github, level -3, advanced streaming, 193253 github, level -3 with dict, advanced streaming, 45395 @@ -1057,8 +1057,8 @@ github, uncompressed literals, advanced github, uncompressed literals optimal, advanced streaming, 157227 github, huffman literals, advanced streaming, 142365 github, multithreaded with advanced params, advanced streaming, 165911 -github.tar, level -5, advanced streaming, 52110 -github.tar, level -5 with dict, advanced streaming, 51070 +github.tar, level -5, advanced streaming, 52152 +github.tar, level -5 with dict, advanced streaming, 51045 github.tar, level -3, advanced streaming, 45678 github.tar, level -3 with dict, advanced streaming, 44656 github.tar, level -1, advanced streaming, 42560 @@ -1182,11 +1182,11 @@ github.tar, uncompressed literals, advanced github.tar, uncompressed literals optimal, advanced streaming, 35397 github.tar, huffman literals, advanced streaming, 38853 github.tar, multithreaded with advanced params, advanced streaming, 41525 -silesia, level -5, old streaming, 6852424 -silesia, level -3, old streaming, 6503413 -silesia, level -1, old streaming, 6172179 +silesia, level -5, old streaming, 6854744 +silesia, level -3, old streaming, 6503319 +silesia, level -1, old streaming, 6172207 silesia, level 0, old streaming, 4842075 -silesia, level 1, old streaming, 5306426 +silesia, level 1, old streaming, 5306388 silesia, level 3, old streaming, 4842075 silesia, level 4, old streaming, 4779186 silesia, level 5, old streaming, 4666323 @@ -1199,12 +1199,12 @@ silesia, level 19, old stre silesia, no source size, old streaming, 4842039 silesia, uncompressed literals, old streaming, 4842075 silesia, uncompressed literals optimal, old streaming, 4296686 -silesia, huffman literals, old streaming, 6172179 -silesia.tar, level -5, old streaming, 6853609 -silesia.tar, level -3, old streaming, 6505969 -silesia.tar, level -1, old streaming, 6179028 +silesia, huffman literals, old streaming, 6172207 +silesia.tar, level -5, old streaming, 6856523 +silesia.tar, level -3, old streaming, 6505954 +silesia.tar, level -1, old streaming, 6179056 silesia.tar, level 0, old streaming, 4859271 -silesia.tar, level 1, old streaming, 5327377 +silesia.tar, level 1, old streaming, 5327708 silesia.tar, level 3, old streaming, 4859271 silesia.tar, level 4, old streaming, 4797470 silesia.tar, level 5, old streaming, 4677748 @@ -1217,8 +1217,8 @@ silesia.tar, level 19, old stre silesia.tar, no source size, old streaming, 4859267 silesia.tar, uncompressed literals, old streaming, 4859271 silesia.tar, uncompressed literals optimal, old streaming, 4267266 -silesia.tar, huffman literals, old streaming, 6179028 -github, level -5, old streaming, 204411 +silesia.tar, huffman literals, old streaming, 6179056 +github, level -5, old streaming, 204407 github, level -5 with dict, old streaming, 46718 github, level -3, old streaming, 193253 github, level -3 with dict, old streaming, 45395 @@ -1251,8 +1251,8 @@ github, no source size with dict, old stre github, uncompressed literals, old streaming, 136332 github, uncompressed literals optimal, old streaming, 134064 github, huffman literals, old streaming, 175468 -github.tar, level -5, old streaming, 52110 -github.tar, level -5 with dict, old streaming, 51070 +github.tar, level -5, old streaming, 52152 +github.tar, level -5 with dict, old streaming, 51045 github.tar, level -3, old streaming, 45678 github.tar, level -3 with dict, old streaming, 44656 github.tar, level -1, old streaming, 42560 @@ -1284,11 +1284,11 @@ github.tar, no source size with dict, old stre github.tar, uncompressed literals, old streaming, 38831 github.tar, uncompressed literals optimal, old streaming, 32134 github.tar, huffman literals, old streaming, 42560 -silesia, level -5, old streaming advanced, 6852424 -silesia, level -3, old streaming advanced, 6503413 -silesia, level -1, old streaming advanced, 6172179 +silesia, level -5, old streaming advanced, 6854744 +silesia, level -3, old streaming advanced, 6503319 +silesia, level -1, old streaming advanced, 6172207 silesia, level 0, old streaming advanced, 4842075 -silesia, level 1, old streaming advanced, 5306426 +silesia, level 1, old streaming advanced, 5306388 silesia, level 3, old streaming advanced, 4842075 silesia, level 4, old streaming advanced, 4779186 silesia, level 5, old streaming advanced, 4666323 @@ -1308,13 +1308,13 @@ silesia, small chain log, old stre silesia, explicit params, old streaming advanced, 4795452 silesia, uncompressed literals, old streaming advanced, 4842075 silesia, uncompressed literals optimal, old streaming advanced, 4296686 -silesia, huffman literals, old streaming advanced, 6172179 +silesia, huffman literals, old streaming advanced, 6172207 silesia, multithreaded with advanced params, old streaming advanced, 4842075 -silesia.tar, level -5, old streaming advanced, 6853609 -silesia.tar, level -3, old streaming advanced, 6505969 -silesia.tar, level -1, old streaming advanced, 6179028 +silesia.tar, level -5, old streaming advanced, 6856523 +silesia.tar, level -3, old streaming advanced, 6505954 +silesia.tar, level -1, old streaming advanced, 6179056 silesia.tar, level 0, old streaming advanced, 4859271 -silesia.tar, level 1, old streaming advanced, 5327377 +silesia.tar, level 1, old streaming advanced, 5327708 silesia.tar, level 3, old streaming advanced, 4859271 silesia.tar, level 4, old streaming advanced, 4797470 silesia.tar, level 5, old streaming advanced, 4677748 @@ -1334,7 +1334,7 @@ silesia.tar, small chain log, old stre silesia.tar, explicit params, old streaming advanced, 4806873 silesia.tar, uncompressed literals, old streaming advanced, 4859271 silesia.tar, uncompressed literals optimal, old streaming advanced, 4267266 -silesia.tar, huffman literals, old streaming advanced, 6179028 +silesia.tar, huffman literals, old streaming advanced, 6179056 silesia.tar, multithreaded with advanced params, old streaming advanced, 4859271 github, level -5, old streaming advanced, 213265 github, level -5 with dict, old streaming advanced, 49562 @@ -1377,8 +1377,8 @@ github, uncompressed literals, old stre github, uncompressed literals optimal, old streaming advanced, 134064 github, huffman literals, old streaming advanced, 181107 github, multithreaded with advanced params, old streaming advanced, 141104 -github.tar, level -5, old streaming advanced, 52110 -github.tar, level -5 with dict, old streaming advanced, 50985 +github.tar, level -5, old streaming advanced, 52152 +github.tar, level -5 with dict, old streaming advanced, 50988 github.tar, level -3, old streaming advanced, 45678 github.tar, level -3 with dict, old streaming advanced, 44729 github.tar, level -1, old streaming advanced, 42560 @@ -1433,7 +1433,7 @@ github, level 13 with dict, old stre github, level 16 with dict, old streaming cdict, 37577 github, level 19 with dict, old streaming cdict, 37576 github, no source size with dict, old streaming cdict, 40654 -github.tar, level -5 with dict, old streaming cdict, 51189 +github.tar, level -5 with dict, old streaming cdict, 51191 github.tar, level -3 with dict, old streaming cdict, 44821 github.tar, level -1 with dict, old streaming cdict, 41775 github.tar, level 0 with dict, old streaming cdict, 37956 From 3620a0a56589c952d248dfccdc96a86b948e9432 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 12 May 2022 12:53:15 -0400 Subject: [PATCH 139/472] Nits --- lib/compress/zstd_double_fast.c | 6 +++--- lib/compress/zstd_fast.c | 23 +++++++++++++++++------ lib/compress/zstd_lazy.c | 6 +++--- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/lib/compress/zstd_double_fast.c b/lib/compress/zstd_double_fast.c index 698a97a80..d8412ef0b 100644 --- a/lib/compress/zstd_double_fast.c +++ b/lib/compress/zstd_double_fast.c @@ -175,9 +175,9 @@ size_t ZSTD_compressBlock_doubleFast_noDict_generic( } while (ip1 <= ilimit); _cleanup: - /* If offset_1 started invalid (offsetSaved1 > 0) and became valid (offset_1 > 0), - * rotate saved offsets. */ - offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */ + offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2; /* save reps for next block */ rep[0] = offset_1 ? offset_1 : offsetSaved1; diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index 3d3b7d9cb..c7d48eb24 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -254,9 +254,20 @@ _cleanup: * However, it seems to be a meaningful performance hit to try to search * them. So let's not. */ - /* If rep_offset1 started invalid (offsetSaved1 > 0) and became valid (rep_offset1 > 0), - * rotate saved offsets. */ - offsetSaved2 = ((offsetSaved1 > 0) & (rep_offset1 > 0)) ? offsetSaved1 : offsetSaved2; + /* When the repcodes are outside of the prefix, we set them to zero before the loop. + * When the offsets are still zero, we need to restore them after the block to have a correct + * repcode history. If only one offset was invalid, it is easy. The tricky case is when both + * offsets were invalid. We need to figure out which offset to refill with. + * - If both offsets are zero they are in the same order. + * - If both offsets are non-zero, we won't restore the offsets from `offsetSaved[12]`. + * - If only one is zero, we need to decide which offset to restore. + * - If rep_offset1 is non-zero, then rep_offset2 must be offsetSaved1. + * - It is impossible for rep_offset2 to be non-zero. + * + * So if rep_offset1 started invalid (offsetSaved1 != 0) and became valid (rep_offset1 != 0), then + * set rep[0] = rep_offset1 and rep[1] = offsetSaved1. + */ + offsetSaved2 = ((offsetSaved1 != 0) && (rep_offset1 != 0)) ? offsetSaved1 : offsetSaved2; /* save reps for next block */ rep[0] = rep_offset1 ? rep_offset1 : offsetSaved1; @@ -762,9 +773,9 @@ _cleanup: * However, it seems to be a meaningful performance hit to try to search * them. So let's not. */ - /* If offset_1 started invalid (offsetSaved1 > 0) and became valid (offset_1 > 0), - * rotate saved offsets. */ - offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */ + offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2; /* save reps for next block */ rep[0] = offset_1 ? offset_1 : offsetSaved1; diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 9814943d1..912b59b9c 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -1682,9 +1682,9 @@ _storeSequence: continue; /* faster when present ... (?) */ } } } - /* If offset_1 started invalid (offsetSaved1 > 0) and became valid (offset_1 > 0), - * rotate saved offsets. */ - offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; + /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0), + * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */ + offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2; /* save reps for next block */ rep[0] = offset_1 ? offset_1 : offsetSaved1; From 14894d63c1d96667e7bb62666a52f3e20e63e23d Mon Sep 17 00:00:00 2001 From: Talha Khan Date: Fri, 20 May 2022 16:53:48 +0800 Subject: [PATCH 140/472] Typo in man --- programs/zstd.1 | 2 +- programs/zstd.1.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/programs/zstd.1 b/programs/zstd.1 index c89060c7d..5d037b815 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -250,7 +250,7 @@ cut file(s) into independent blocks of size # (default: no block) \fB\-\-priority=rt\fR set process priority to real\-time .P -\fBOutput Format:\fR CompressionLevel#Filename : IntputSize \-> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed +\fBOutput Format:\fR CompressionLevel#Filename : InputSize \-> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed .P \fBMethodology:\fR For both compression and decompression speed, the entire input is compressed/decompressed in\-memory to measure speed\. A run lasts at least 1 sec, so when files are small, they are compressed/decompressed several times per run, in order to improve measurement accuracy\. .SH "ADVANCED COMPRESSION OPTIONS" diff --git a/programs/zstd.1.md b/programs/zstd.1.md index 4e176f399..d415211d6 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -473,7 +473,7 @@ BENCHMARK * `--priority=rt`: set process priority to real-time -**Output Format:** CompressionLevel#Filename : IntputSize -> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed +**Output Format:** CompressionLevel#Filename : InputSize -> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed **Methodology:** For both compression and decompression speed, the entire input is compressed/decompressed in-memory to measure speed. A run lasts at least 1 sec, so when files are small, they are compressed/decompressed several times per run, in order to improve measurement accuracy. From e11783b04d1c49678bb4f95a4ecaa26323bd823d Mon Sep 17 00:00:00 2001 From: Danila Kutenin Date: Sun, 22 May 2022 10:34:33 +0000 Subject: [PATCH 141/472] [lazy] Optimize ZSTD_row_getMatchMask for level 8-10 We found that movemask is not used properly or consumes too much CPU. This effort helps to optimize the movemask emulation on ARM. For level 8-9 we saw 3-5% improvements. For level 10 we say 1.5% improvement. The key idea is not to use pure movemasks but to have groups of bits. For rowEntries == 16, 32 we are going to have groups of size 4 and 2 respectively. It means that each bit will be duplicated within the group Then we do AND to have only one bit set in the group so that iteration with lowering bit `a &= (a - 1)` works as well. Also, aarch64 does not have rotate instructions for 16 bit, only for 32 and 64, that's why we see more improvements for level 8-9. vshrn_n_u16 instruction is used to achieve that: vshrn_n_u16 shifts by 4 every u16 and narrows to 8 lower bits. See the picture below. It's also used in [Folly](https://github.com/facebook/folly/blob/c5702590080aa5d0e8d666d91861d64634065132/folly/container/detail/F14Table.h#L446). It also uses 2 cycles according to Neoverse-N{1,2} guidelines. 64 bit movemask is already well optimized. We have ongoing experiments but were not able to validate other implementations work reliably faster. --- lib/compress/zstd_lazy.c | 95 +++++++++++++++++++++++++--------------- 1 file changed, 60 insertions(+), 35 deletions(-) diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 912b59b9c..d897832ba 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -974,20 +974,45 @@ ZSTD_row_getSSEMask(int nbChunks, const BYTE* const src, const BYTE tag, const U } #endif -/* Returns a ZSTD_VecMask (U32) that has the nth bit set to 1 if the newly-computed "tag" matches - * the hash at the nth position in a row of the tagTable. - * Each row is a circular buffer beginning at the value of "head". So we must rotate the "matches" bitfield - * to match up with the actual layout of the entries within the hashTable */ +/* Returns the mask width of bits group of which will be set to 1. Given not all + * architectures have easy movemask instruction, this helps to iterate over + * groups of bits easier and faster. + */ +FORCE_INLINE_TEMPLATE U32 +ZSTD_row_matchMaskGroupWidth(const U32 rowEntries) { + assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); + assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); +#if defined(ZSTD_ARCH_ARM_NEON) + if (rowEntries == 16) { + return 4; + } + if (rowEntries == 32) { + return 2; + } + if (rowEntries == 64) { + return 1; + } +#endif + return 1; +} + +/* Returns a ZSTD_VecMask (U64) that has the nth group (determined by + * ZSTD_row_matchMaskGroupWidth) of bits set to 1 if the newly-computed "tag" + * matches the hash at the nth position in a row of the tagTable. + * Each row is a circular buffer beginning at the value of "headGrouped". So we + * must rotate the "matches" bitfield to match up with the actual layout of the + * entries within the hashTable */ FORCE_INLINE_TEMPLATE ZSTD_VecMask -ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, const U32 head, const U32 rowEntries) +ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, const U32 headGrouped, const U32 rowEntries) { const BYTE* const src = tagRow + ZSTD_ROW_HASH_TAG_OFFSET; assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); + assert(ZSTD_row_matchMaskGroupWidth(rowEntries) * rowEntries <= sizeof(ZSTD_VecMask) * 8); #if defined(ZSTD_ARCH_X86_SSE2) - return ZSTD_row_getSSEMask(rowEntries / 16, src, tag, head); + return ZSTD_row_getSSEMask(rowEntries / 16, src, tag, headGrouped); #else /* SW or NEON-LE */ @@ -995,30 +1020,29 @@ ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, const U32 head, /* This NEON path only works for little endian - otherwise use SWAR below */ if (MEM_isLittleEndian()) { if (rowEntries == 16) { + /* vshrn_n_u16 shifts by 4 every u16 and narrows to 8 lower bits. + * After that groups of 4 bits represent the equalMask. We lower + * all bits except the highest in these groups by doing AND with + * 0x88 = 0b10001000. + */ const uint8x16_t chunk = vld1q_u8(src); const uint16x8_t equalMask = vreinterpretq_u16_u8(vceqq_u8(chunk, vdupq_n_u8(tag))); - const uint16x8_t t0 = vshlq_n_u16(equalMask, 7); - const uint32x4_t t1 = vreinterpretq_u32_u16(vsriq_n_u16(t0, t0, 14)); - const uint64x2_t t2 = vreinterpretq_u64_u32(vshrq_n_u32(t1, 14)); - const uint8x16_t t3 = vreinterpretq_u8_u64(vsraq_n_u64(t2, t2, 28)); - const U16 hi = (U16)vgetq_lane_u8(t3, 8); - const U16 lo = (U16)vgetq_lane_u8(t3, 0); - return ZSTD_rotateRight_U16((hi << 8) | lo, head); + const uint8x8_t res = vshrn_n_u16(equalMask, 4); + const U64 matches = vget_lane_u64(vreinterpret_u64_u8(res), 0); + return ZSTD_rotateRight_U64(matches, headGrouped) & 0x8888888888888888ull; } else if (rowEntries == 32) { - const uint16x8x2_t chunk = vld2q_u16((const U16*)(const void*)src); + /* Same idea as with rowEntries == 16 but doing AND with + * 0x55 = 0b01010101. + */ + const uint16x8x2_t chunk = vld2q_u16((const uint16_t*)(const void*)src); const uint8x16_t chunk0 = vreinterpretq_u8_u16(chunk.val[0]); const uint8x16_t chunk1 = vreinterpretq_u8_u16(chunk.val[1]); - const uint8x16_t equalMask0 = vceqq_u8(chunk0, vdupq_n_u8(tag)); - const uint8x16_t equalMask1 = vceqq_u8(chunk1, vdupq_n_u8(tag)); - const int8x8_t pack0 = vqmovn_s16(vreinterpretq_s16_u8(equalMask0)); - const int8x8_t pack1 = vqmovn_s16(vreinterpretq_s16_u8(equalMask1)); - const uint8x8_t t0 = vreinterpret_u8_s8(pack0); - const uint8x8_t t1 = vreinterpret_u8_s8(pack1); - const uint8x8_t t2 = vsri_n_u8(t1, t0, 2); - const uint8x8x2_t t3 = vuzp_u8(t2, t0); - const uint8x8_t t4 = vsri_n_u8(t3.val[1], t3.val[0], 4); - const U32 matches = vget_lane_u32(vreinterpret_u32_u8(t4), 0); - return ZSTD_rotateRight_U32(matches, head); + const uint8x16_t dup = vdupq_n_u8(tag); + const uint8x8_t t0 = vshrn_n_u16(vreinterpretq_u16_u8(vceqq_u8(chunk0, dup)), 6); + const uint8x8_t t1 = vshrn_n_u16(vreinterpretq_u16_u8(vceqq_u8(chunk1, dup)), 6); + const uint8x8_t res = vsli_n_u8(t0, t1, 4); + const U64 matches = vget_lane_u64(vreinterpret_u64_u8(res), 0) ; + return ZSTD_rotateRight_U64(matches, headGrouped) & 0x5555555555555555ull; } else { /* rowEntries == 64 */ const uint8x16x4_t chunk = vld4q_u8(src); const uint8x16_t dup = vdupq_n_u8(tag); @@ -1033,7 +1057,7 @@ ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, const U32 head, const uint8x16_t t3 = vsriq_n_u8(t2, t2, 4); const uint8x8_t t4 = vshrn_n_u16(vreinterpretq_u16_u8(t3), 4); const U64 matches = vget_lane_u64(vreinterpret_u64_u8(t4), 0); - return ZSTD_rotateRight_U64(matches, head); + return ZSTD_rotateRight_U64(matches, headGrouped); } } # endif /* ZSTD_ARCH_ARM_NEON */ @@ -1071,11 +1095,11 @@ ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, const U32 head, } matches = ~matches; if (rowEntries == 16) { - return ZSTD_rotateRight_U16((U16)matches, head); + return ZSTD_rotateRight_U16((U16)matches, headGrouped); } else if (rowEntries == 32) { - return ZSTD_rotateRight_U32((U32)matches, head); + return ZSTD_rotateRight_U32((U32)matches, headGrouped); } else { - return ZSTD_rotateRight_U64((U64)matches, head); + return ZSTD_rotateRight_U64((U64)matches, headGrouped); } } #endif @@ -1123,6 +1147,7 @@ size_t ZSTD_RowFindBestMatch( const U32 rowEntries = (1U << rowLog); const U32 rowMask = rowEntries - 1; const U32 cappedSearchLog = MIN(cParams->searchLog, rowLog); /* nb of searches is capped at nb entries per row */ + const U32 groupWidth = ZSTD_row_matchMaskGroupWidth(rowEntries); U32 nbAttempts = 1U << cappedSearchLog; size_t ml=4-1; @@ -1165,15 +1190,15 @@ size_t ZSTD_RowFindBestMatch( U32 const tag = hash & ZSTD_ROW_HASH_TAG_MASK; U32* const row = hashTable + relRow; BYTE* tagRow = (BYTE*)(tagTable + relRow); - U32 const head = *tagRow & rowMask; + U32 const headGrouped = (*tagRow & rowMask) * groupWidth; U32 matchBuffer[ZSTD_ROW_HASH_MAX_ENTRIES]; size_t numMatches = 0; size_t currMatch = 0; - ZSTD_VecMask matches = ZSTD_row_getMatchMask(tagRow, (BYTE)tag, head, rowEntries); + ZSTD_VecMask matches = ZSTD_row_getMatchMask(tagRow, (BYTE)tag, headGrouped, rowEntries); /* Cycle through the matches and prefetch */ for (; (matches > 0) && (nbAttempts > 0); --nbAttempts, matches &= (matches - 1)) { - U32 const matchPos = (head + ZSTD_VecMask_next(matches)) & rowMask; + U32 const matchPos = ((headGrouped + ZSTD_VecMask_next(matches)) / groupWidth) & rowMask; U32 const matchIndex = row[matchPos]; assert(numMatches < rowEntries); if (matchIndex < lowLimit) @@ -1234,14 +1259,14 @@ size_t ZSTD_RowFindBestMatch( const U32 dmsSize = (U32)(dmsEnd - dmsBase); const U32 dmsIndexDelta = dictLimit - dmsSize; - { U32 const head = *dmsTagRow & rowMask; + { U32 const headGrouped = (*dmsTagRow & rowMask) * groupWidth; U32 matchBuffer[ZSTD_ROW_HASH_MAX_ENTRIES]; size_t numMatches = 0; size_t currMatch = 0; - ZSTD_VecMask matches = ZSTD_row_getMatchMask(dmsTagRow, (BYTE)dmsTag, head, rowEntries); + ZSTD_VecMask matches = ZSTD_row_getMatchMask(dmsTagRow, (BYTE)dmsTag, headGrouped, rowEntries); for (; (matches > 0) && (nbAttempts > 0); --nbAttempts, matches &= (matches - 1)) { - U32 const matchPos = (head + ZSTD_VecMask_next(matches)) & rowMask; + U32 const matchPos = ((headGrouped + ZSTD_VecMask_next(matches)) / groupWidth) & rowMask; U32 const matchIndex = dmsRow[matchPos]; if (matchIndex < dmsLowestIndex) break; From 778f639be961ab6c83ab84e0f3fd3ecb0fd09f4f Mon Sep 17 00:00:00 2001 From: Danila Kutenin Date: Sun, 22 May 2022 10:50:33 +0000 Subject: [PATCH 142/472] Disable unused variable warning --- lib/compress/zstd_lazy.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index d897832ba..5e9a06b9e 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -982,6 +982,7 @@ FORCE_INLINE_TEMPLATE U32 ZSTD_row_matchMaskGroupWidth(const U32 rowEntries) { assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); + (void)rowEntries; #if defined(ZSTD_ARCH_ARM_NEON) if (rowEntries == 16) { return 4; From 6b561d230fd71de732346838752051c349c52f2e Mon Sep 17 00:00:00 2001 From: Danila Kutenin Date: Mon, 23 May 2022 14:49:35 +0000 Subject: [PATCH 143/472] Move NEON version to a separate function and fix indentation --- lib/compress/zstd_lazy.c | 129 +++++++++++++++++++++------------------ 1 file changed, 69 insertions(+), 60 deletions(-) diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 5e9a06b9e..6404d29f9 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -954,6 +954,29 @@ void ZSTD_row_update(ZSTD_matchState_t* const ms, const BYTE* ip) { ZSTD_row_update_internal(ms, ip, mls, rowLog, rowMask, 0 /* don't use cache */); } +/* Returns the mask width of bits group of which will be set to 1. Given not all + * architectures have easy movemask instruction, this helps to iterate over + * groups of bits easier and faster. + */ +FORCE_INLINE_TEMPLATE U32 +ZSTD_row_matchMaskGroupWidth(const U32 rowEntries) +{ + assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); + assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); +#if defined(ZSTD_ARCH_ARM_NEON) + if (rowEntries == 16) { + return 4; + } + if (rowEntries == 32) { + return 2; + } + if (rowEntries == 64) { + return 1; + } +#endif + return 1; +} + #if defined(ZSTD_ARCH_X86_SSE2) FORCE_INLINE_TEMPLATE ZSTD_VecMask ZSTD_row_getSSEMask(int nbChunks, const BYTE* const src, const BYTE tag, const U32 head) @@ -974,28 +997,53 @@ ZSTD_row_getSSEMask(int nbChunks, const BYTE* const src, const BYTE tag, const U } #endif -/* Returns the mask width of bits group of which will be set to 1. Given not all - * architectures have easy movemask instruction, this helps to iterate over - * groups of bits easier and faster. - */ -FORCE_INLINE_TEMPLATE U32 -ZSTD_row_matchMaskGroupWidth(const U32 rowEntries) { - assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); - assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); - (void)rowEntries; #if defined(ZSTD_ARCH_ARM_NEON) - if (rowEntries == 16) { - return 4; - } - if (rowEntries == 32) { - return 2; - } - if (rowEntries == 64) { - return 1; - } -#endif - return 1; +FORCE_INLINE_TEMPLATE ZSTD_VecMask +ZSTD_row_getNEONMask(const U32 rowEntries, const BYTE* const src, const BYTE tag, const U32 headGrouped) +{ + assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); + if (rowEntries == 16) { + /* vshrn_n_u16 shifts by 4 every u16 and narrows to 8 lower bits. + * After that groups of 4 bits represent the equalMask. We lower + * all bits except the highest in these groups by doing AND with + * 0x88 = 0b10001000. + */ + const uint8x16_t chunk = vld1q_u8(src); + const uint16x8_t equalMask = vreinterpretq_u16_u8(vceqq_u8(chunk, vdupq_n_u8(tag))); + const uint8x8_t res = vshrn_n_u16(equalMask, 4); + const U64 matches = vget_lane_u64(vreinterpret_u64_u8(res), 0); + return ZSTD_rotateRight_U64(matches, headGrouped) & 0x8888888888888888ull; + } else if (rowEntries == 32) { + /* Same idea as with rowEntries == 16 but doing AND with + * 0x55 = 0b01010101. + */ + const uint16x8x2_t chunk = vld2q_u16((const uint16_t*)(const void*)src); + const uint8x16_t chunk0 = vreinterpretq_u8_u16(chunk.val[0]); + const uint8x16_t chunk1 = vreinterpretq_u8_u16(chunk.val[1]); + const uint8x16_t dup = vdupq_n_u8(tag); + const uint8x8_t t0 = vshrn_n_u16(vreinterpretq_u16_u8(vceqq_u8(chunk0, dup)), 6); + const uint8x8_t t1 = vshrn_n_u16(vreinterpretq_u16_u8(vceqq_u8(chunk1, dup)), 6); + const uint8x8_t res = vsli_n_u8(t0, t1, 4); + const U64 matches = vget_lane_u64(vreinterpret_u64_u8(res), 0) ; + return ZSTD_rotateRight_U64(matches, headGrouped) & 0x5555555555555555ull; + } else { /* rowEntries == 64 */ + const uint8x16x4_t chunk = vld4q_u8(src); + const uint8x16_t dup = vdupq_n_u8(tag); + const uint8x16_t cmp0 = vceqq_u8(chunk.val[0], dup); + const uint8x16_t cmp1 = vceqq_u8(chunk.val[1], dup); + const uint8x16_t cmp2 = vceqq_u8(chunk.val[2], dup); + const uint8x16_t cmp3 = vceqq_u8(chunk.val[3], dup); + + const uint8x16_t t0 = vsriq_n_u8(cmp1, cmp0, 1); + const uint8x16_t t1 = vsriq_n_u8(cmp3, cmp2, 1); + const uint8x16_t t2 = vsriq_n_u8(t1, t0, 2); + const uint8x16_t t3 = vsriq_n_u8(t2, t2, 4); + const uint8x8_t t4 = vshrn_n_u16(vreinterpretq_u16_u8(t3), 4); + const U64 matches = vget_lane_u64(vreinterpret_u64_u8(t4), 0); + return ZSTD_rotateRight_U64(matches, headGrouped); + } } +#endif /* Returns a ZSTD_VecMask (U64) that has the nth group (determined by * ZSTD_row_matchMaskGroupWidth) of bits set to 1 if the newly-computed "tag" @@ -1020,46 +1068,7 @@ ZSTD_row_getMatchMask(const BYTE* const tagRow, const BYTE tag, const U32 headGr # if defined(ZSTD_ARCH_ARM_NEON) /* This NEON path only works for little endian - otherwise use SWAR below */ if (MEM_isLittleEndian()) { - if (rowEntries == 16) { - /* vshrn_n_u16 shifts by 4 every u16 and narrows to 8 lower bits. - * After that groups of 4 bits represent the equalMask. We lower - * all bits except the highest in these groups by doing AND with - * 0x88 = 0b10001000. - */ - const uint8x16_t chunk = vld1q_u8(src); - const uint16x8_t equalMask = vreinterpretq_u16_u8(vceqq_u8(chunk, vdupq_n_u8(tag))); - const uint8x8_t res = vshrn_n_u16(equalMask, 4); - const U64 matches = vget_lane_u64(vreinterpret_u64_u8(res), 0); - return ZSTD_rotateRight_U64(matches, headGrouped) & 0x8888888888888888ull; - } else if (rowEntries == 32) { - /* Same idea as with rowEntries == 16 but doing AND with - * 0x55 = 0b01010101. - */ - const uint16x8x2_t chunk = vld2q_u16((const uint16_t*)(const void*)src); - const uint8x16_t chunk0 = vreinterpretq_u8_u16(chunk.val[0]); - const uint8x16_t chunk1 = vreinterpretq_u8_u16(chunk.val[1]); - const uint8x16_t dup = vdupq_n_u8(tag); - const uint8x8_t t0 = vshrn_n_u16(vreinterpretq_u16_u8(vceqq_u8(chunk0, dup)), 6); - const uint8x8_t t1 = vshrn_n_u16(vreinterpretq_u16_u8(vceqq_u8(chunk1, dup)), 6); - const uint8x8_t res = vsli_n_u8(t0, t1, 4); - const U64 matches = vget_lane_u64(vreinterpret_u64_u8(res), 0) ; - return ZSTD_rotateRight_U64(matches, headGrouped) & 0x5555555555555555ull; - } else { /* rowEntries == 64 */ - const uint8x16x4_t chunk = vld4q_u8(src); - const uint8x16_t dup = vdupq_n_u8(tag); - const uint8x16_t cmp0 = vceqq_u8(chunk.val[0], dup); - const uint8x16_t cmp1 = vceqq_u8(chunk.val[1], dup); - const uint8x16_t cmp2 = vceqq_u8(chunk.val[2], dup); - const uint8x16_t cmp3 = vceqq_u8(chunk.val[3], dup); - - const uint8x16_t t0 = vsriq_n_u8(cmp1, cmp0, 1); - const uint8x16_t t1 = vsriq_n_u8(cmp3, cmp2, 1); - const uint8x16_t t2 = vsriq_n_u8(t1, t0, 2); - const uint8x16_t t3 = vsriq_n_u8(t2, t2, 4); - const uint8x8_t t4 = vshrn_n_u16(vreinterpretq_u16_u8(t3), 4); - const U64 matches = vget_lane_u64(vreinterpret_u64_u8(t4), 0); - return ZSTD_rotateRight_U64(matches, headGrouped); - } + return ZSTD_row_getNEONMask(rowEntries, src, tag, headGrouped); } # endif /* ZSTD_ARCH_ARM_NEON */ /* SWAR */ From 9166c6ae204950b22c8fd5c0fb0cd2ee4c4b5abf Mon Sep 17 00:00:00 2001 From: Danila Kutenin Date: Mon, 23 May 2022 14:51:47 +0000 Subject: [PATCH 144/472] Again unused error warning. Fixed --- lib/compress/zstd_lazy.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 6404d29f9..6f8d11e14 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -963,6 +963,7 @@ ZSTD_row_matchMaskGroupWidth(const U32 rowEntries) { assert((rowEntries == 16) || (rowEntries == 32) || rowEntries == 64); assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); + (void)rowEntries; #if defined(ZSTD_ARCH_ARM_NEON) if (rowEntries == 16) { return 4; From f33ccd2d1b7e7a1b20ca721c5d05193b2eb5e637 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 24 May 2022 04:47:49 -0700 Subject: [PATCH 145/472] fix small error in format documentation example reported by @dkcasset fix #3142 --- doc/zstd_compression_format.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/zstd_compression_format.md b/doc/zstd_compression_format.md index cd53b7f94..419de38eb 100644 --- a/doc/zstd_compression_format.md +++ b/doc/zstd_compression_format.md @@ -945,14 +945,14 @@ sequences are applied to them: |:--------------:|:-----------------:|:------------------:|:------------------:|:------------------:|:-----------------------:| | | | 1 | 4 | 8 | starting values | | 1114 | 11 | 1111 | 1 | 4 | non-repeat | -| 1 | 22 | 1111 | 1 | 4 | repeat 1; no change | +| 1 | 22 | 1111 | 1 | 4 | repeat 1: no change | | 2225 | 22 | 2222 | 1111 | 1 | non-repeat | | 1114 | 111 | 1111 | 2222 | 1111 | non-repeat | | 3336 | 33 | 3333 | 1111 | 2222 | non-repeat | -| 2 | 22 | 1111 | 3333 | 2222 | repeat 2; swap 1 & 2 | -| 3 | 33 | 2222 | 1111 | 3333 | repeat 3; rotate 3 to 1 | -| 3 | 0 | 2221 | 2222 | 1111 | insert resolved offset | -| 1 | 0 | 2222 | 2221 | 3333 | repeat 2 | +| 2 | 22 | 1111 | 3333 | 2222 | repeat 2: swap 1 & 2 | +| 3 | 33 | 2222 | 1111 | 3333 | repeat 3: rotate 3 to 1 | +| 3 | 0 | 2221 | 2222 | 1111 | special case : insert `repeat1 - 1` | +| 1 | 0 | 2222 | 2221 | 1111 | == repeat 2 | Skippable Frames From d7249dafb43825dc2048a6bdce4e3c9b7606e0ae Mon Sep 17 00:00:00 2001 From: Jun He Date: Wed, 25 May 2022 22:26:41 +0800 Subject: [PATCH 146/472] common: apply two stage copy to aarch64 On aarch64 ZSTD_wildcopy uses a simple loop to do 16B based memory copy. There is existing optimized two stage copy that can achieve better performance. By applying this to aarch64 it is also observed ~1% uplift in silesia corpus. Signed-off-by: Jun He Change-Id: Ic1253308e7a8a7df2d08963ba544e086c81ce8be --- lib/common/zstd_internal.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib/common/zstd_internal.h b/lib/common/zstd_internal.h index 8e2b84a23..e76b8e19d 100644 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@ -235,12 +235,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e * one COPY16() in the first call. Then, do two calls per loop since * at that point it is more likely to have a high trip count. */ -#ifdef __aarch64__ - do { - COPY16(op, ip); - } - while (op < oend); -#else ZSTD_copy16(op, ip); if (16 >= length) return; op += 16; @@ -250,7 +244,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e COPY16(op, ip); } while (op < oend); -#endif } } From 95073b1af1c15a9c3a5344d2e98ff27f41c1d872 Mon Sep 17 00:00:00 2001 From: Ma Lin Date: Mon, 30 May 2022 08:18:54 +0800 Subject: [PATCH 147/472] fix leaking thread handles on Windows On Windows, thread handle should be closed explicitly. Co-authored-by: luben karavelov --- lib/common/threading.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/common/threading.c b/lib/common/threading.c index 92cf57c19..4f69f7662 100644 --- a/lib/common/threading.c +++ b/lib/common/threading.c @@ -63,6 +63,8 @@ int ZSTD_pthread_join(ZSTD_pthread_t thread, void **value_ptr) if (!thread.handle) return 0; result = WaitForSingleObject(thread.handle, INFINITE); + CloseHandle(thread.handle); + switch (result) { case WAIT_OBJECT_0: if (value_ptr) *value_ptr = thread.arg; From 5081ccb05620bdec6e07464213f871bc0381a63f Mon Sep 17 00:00:00 2001 From: ihsinme Date: Mon, 30 May 2022 14:08:19 +0300 Subject: [PATCH 148/472] Update zstd_compress.c --- lib/compress/zstd_compress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index e43bbec44..f60fb4351 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -5873,7 +5873,7 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, dictSize = 0; } ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t)); - for (; (inSeqs[idx].matchLength != 0 || inSeqs[idx].offset != 0) && idx < inSeqsSize; ++idx) { + for (; idx < inSeqsSize && (inSeqs[idx].matchLength != 0 || inSeqs[idx].offset != 0); ++idx) { U32 const litLength = inSeqs[idx].litLength; U32 const ll0 = (litLength == 0); U32 const matchLength = inSeqs[idx].matchLength; From 2491c65937d42561ef9238422929213751adcc10 Mon Sep 17 00:00:00 2001 From: Jun He Date: Mon, 23 May 2022 14:25:10 +0800 Subject: [PATCH 149/472] dec: adjust seqSymbol load on aarch64 ZSTD_seqSymbol is a structure with total of 64 bits wide. So it can be loaded in one operation and extract its fields by simply shifting or extracting on aarch64. GCC doesn't recognize this and generates more unnecessary ldr/ldrb/ldrh operations that cause performance drop. With this change it is observed 2~4% uplift of silesia and 2.5~6% of cantrbry @L8 on Arm N1. Signed-off-by: Jun He Change-Id: I7748909204cf78a17eb9d4f2333692d53239daa8 --- lib/decompress/zstd_decompress_block.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index 7c046dab5..466e83b6b 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -1170,9 +1170,27 @@ FORCE_INLINE_TEMPLATE seq_t ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets) { seq_t seq; + /* + * ZSTD_seqSymbol is a structure with a total of 64 bits wide. So it can be + * loaded in one operation and extracted its fields by simply shifting or + * bit-extracting on aarch64. + * GCC doesn't recognize this and generates more unnecessary ldr/ldrb/ldrh + * operations that cause performance drop. This can be avoided by using this + * ZSTD_memcpy hack. + */ +#if defined(__aarch64__) && (defined(__GNUC__) && !defined(__clang__)) + ZSTD_seqSymbol llDInfoS, mlDInfoS, ofDInfoS; + ZSTD_seqSymbol* const llDInfo = &llDInfoS; + ZSTD_seqSymbol* const mlDInfo = &mlDInfoS; + ZSTD_seqSymbol* const ofDInfo = &ofDInfoS; + ZSTD_memcpy(llDInfo, seqState->stateLL.table + seqState->stateLL.state, sizeof(ZSTD_seqSymbol)); + ZSTD_memcpy(mlDInfo, seqState->stateML.table + seqState->stateML.state, sizeof(ZSTD_seqSymbol)); + ZSTD_memcpy(ofDInfo, seqState->stateOffb.table + seqState->stateOffb.state, sizeof(ZSTD_seqSymbol)); +#else const ZSTD_seqSymbol* const llDInfo = seqState->stateLL.table + seqState->stateLL.state; const ZSTD_seqSymbol* const mlDInfo = seqState->stateML.table + seqState->stateML.state; const ZSTD_seqSymbol* const ofDInfo = seqState->stateOffb.table + seqState->stateOffb.state; +#endif seq.matchLength = mlDInfo->baseValue; seq.litLength = llDInfo->baseValue; { U32 const ofBase = ofDInfo->baseValue; From 7c05b9aec3e18bf733cccff6dda97ea269bb8594 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Mon, 6 Jun 2022 11:56:13 -0700 Subject: [PATCH 150/472] Remove expensive assert in --rsyncable hot loop This assert slows the loop down by 10x. We can get similar coverage by asserting at the beginning & end of the loop. We need this fix because Debian compiles zstd with asserts enabled. Separately, we should ask them why, and if they would consider disabling asserts in their builds. Since we don't optimize for assert enabled builds. Fixes Issue #3150. --- lib/compress/zstdmt_compress.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/compress/zstdmt_compress.c b/lib/compress/zstdmt_compress.c index 4ac2249bd..0c10eb603 100644 --- a/lib/compress/zstdmt_compress.c +++ b/lib/compress/zstdmt_compress.c @@ -1761,17 +1761,24 @@ findSynchronizationPoint(ZSTDMT_CCtx const* mtctx, ZSTD_inBuffer const input) * then a block will be emitted anyways, but this is okay, since if we * are already synchronized we will remain synchronized. */ + assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); for (; pos < syncPoint.toLoad; ++pos) { BYTE const toRemove = pos < RSYNC_LENGTH ? prev[pos] : istart[pos - RSYNC_LENGTH]; - assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); + /* This assert is very expensive, and Debian compiles with asserts enabled. + * So disable it for now. We can get similar coverage by checking it at the + * beginning & end of the loop. + * assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); + */ hash = ZSTD_rollingHash_rotate(hash, toRemove, istart[pos], primePower); assert(mtctx->inBuff.filled + pos >= RSYNC_MIN_BLOCK_SIZE); if ((hash & hitMask) == hitMask) { syncPoint.toLoad = pos + 1; syncPoint.flush = 1; + ++pos; /* for assert */ break; } } + assert(pos < RSYNC_LENGTH || ZSTD_rollingHash_compute(istart + pos - RSYNC_LENGTH, RSYNC_LENGTH) == hash); return syncPoint; } From 27bf96e72bb786a94f7fef13b7f2e5d7ee1d6d48 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 7 Jun 2022 17:44:20 -0700 Subject: [PATCH 151/472] updated --single-thread man --- programs/zstd.1 | 261 ++++++++++++++++++++++++++++++++++++--------- programs/zstd.1.md | 13 +-- 2 files changed, 218 insertions(+), 56 deletions(-) diff --git a/programs/zstd.1 b/programs/zstd.1 index 5d037b815..dbdc30172 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -1,357 +1,518 @@ -.TH "ZSTD" "1" "April 2022" "zstd 1.5.2" "User Commands" +. +.TH "ZSTD" "1" "June 2022" "zstd 1.5.2" "User Commands" +. .SH "NAME" \fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files +. .SH "SYNOPSIS" -.TS -allbox; -\fBzstd\fR [\fIOPTIONS\fR] [\- \fIINPUT\-FILE\fR] [\-o \fIOUTPUT\-FILE\fR] -.TE +\fBzstd\fR [\fIOPTIONS\fR] [\-|\fIINPUT\-FILE\fR] [\-o \fIOUTPUT\-FILE\fR] +. .P \fBzstdmt\fR is equivalent to \fBzstd \-T0\fR +. .P \fBunzstd\fR is equivalent to \fBzstd \-d\fR +. .P \fBzstdcat\fR is equivalent to \fBzstd \-dcf\fR +. .SH "DESCRIPTION" \fBzstd\fR is a fast lossless compression algorithm and data compression tool, with command line syntax similar to \fBgzip (1)\fR and \fBxz (1)\fR\. It is based on the \fBLZ77\fR family, with further FSE & huff0 entropy stages\. \fBzstd\fR offers highly configurable compression speed, from fast modes at > 200 MB/s per core, to strong modes with excellent compression ratios\. It also features a very fast decoder, with speeds > 500 MB/s per core\. +. .P \fBzstd\fR command line syntax is generally similar to gzip, but features the following differences : -.IP "\[ci]" 4 +. +.IP "\(bu" 4 Source files are preserved by default\. It\'s possible to remove them automatically by using the \fB\-\-rm\fR command\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 When compressing a single file, \fBzstd\fR displays progress notifications and result summary by default\. Use \fB\-q\fR to turn them off\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fBzstd\fR displays a short help page when command line is an error\. Use \fB\-q\fR to turn it off\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fBzstd\fR does not accept input from console, though it does accept \fBstdin\fR when it\'s not the console\. +. .IP "" 0 +. .P \fBzstd\fR processes each \fIfile\fR according to the selected operation mode\. If no \fIfiles\fR are given or \fIfile\fR is \fB\-\fR, \fBzstd\fR reads from standard input and writes the processed data to standard output\. \fBzstd\fR will refuse to write compressed data to standard output if it is a terminal : it will display an error message and skip the \fIfile\fR\. Similarly, \fBzstd\fR will refuse to read compressed data from standard input if it is a terminal\. +. .P Unless \fB\-\-stdout\fR or \fB\-o\fR is specified, \fIfiles\fR are written to a new file whose name is derived from the source \fIfile\fR name: -.IP "\[ci]" 4 +. +.IP "\(bu" 4 When compressing, the suffix \fB\.zst\fR is appended to the source filename to get the target filename\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 When decompressing, the \fB\.zst\fR suffix is removed from the source filename to get the target filename +. .IP "" 0 +. .SS "Concatenation with \.zst files" It is possible to concatenate multiple \fB\.zst\fR files\. \fBzstd\fR will decompress such agglomerated file as if it was a single \fB\.zst\fR file\. +. .SH "OPTIONS" +. .SS "Integer suffixes and special values" In most places where an integer argument is expected, an optional suffix is supported to easily indicate large integers\. There must be no space between the integer and the suffix\. +. .TP \fBKiB\fR -Multiply the integer by 1,024 (2\e^10)\. \fBKi\fR, \fBK\fR, and \fBKB\fR are accepted as synonyms for \fBKiB\fR\. +Multiply the integer by 1,024 (2^10)\. \fBKi\fR, \fBK\fR, and \fBKB\fR are accepted as synonyms for \fBKiB\fR\. +. .TP \fBMiB\fR -Multiply the integer by 1,048,576 (2\e^20)\. \fBMi\fR, \fBM\fR, and \fBMB\fR are accepted as synonyms for \fBMiB\fR\. +Multiply the integer by 1,048,576 (2^20)\. \fBMi\fR, \fBM\fR, and \fBMB\fR are accepted as synonyms for \fBMiB\fR\. +. .SS "Operation mode" If multiple operation mode options are given, the last one takes effect\. +. .TP \fB\-z\fR, \fB\-\-compress\fR Compress\. This is the default operation mode when no operation mode option is specified and no other operation mode is implied from the command name (for example, \fBunzstd\fR implies \fB\-\-decompress\fR)\. +. .TP \fB\-d\fR, \fB\-\-decompress\fR, \fB\-\-uncompress\fR Decompress\. +. .TP \fB\-t\fR, \fB\-\-test\fR Test the integrity of compressed \fIfiles\fR\. This option is equivalent to \fB\-\-decompress \-\-stdout > /dev/null\fR, decompressed data is discarded and checksummed for errors\. No files are created or removed\. +. .TP \fB\-b#\fR Benchmark file(s) using compression level # +. .TP \fB\-\-train FILEs\fR Use FILEs as a training set to create a dictionary\. The training set should contain a lot of small files (> 100)\. +. .TP \fB\-l\fR, \fB\-\-list\fR Display information related to a zstd compressed file, such as size, ratio, and checksum\. Some of these fields may not be available\. This command\'s output can be augmented with the \fB\-v\fR modifier\. +. .SS "Operation modifiers" -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-#\fR: \fB#\fR compression level [1\-19] (default: 3) -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-ultra\fR: unlocks high compression levels 20+ (maximum 22), using a lot more memory\. Note that decompression will also require more memory when using these levels\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-fast[=#]\fR: switch to ultra\-fast compression levels\. If \fB=#\fR is not present, it defaults to \fB1\fR\. The higher the value, the faster the compression speed, at the cost of some compression ratio\. This setting overwrites compression level if one was set previously\. Similarly, if a compression level is set after \fB\-\-fast\fR, it overrides it\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-T#\fR, \fB\-\-threads=#\fR: Compress using \fB#\fR working threads (default: 1)\. If \fB#\fR is 0, attempt to detect and use the number of physical CPU cores\. In all cases, the nb of threads is capped to \fBZSTDMT_NBWORKERS_MAX\fR, which is either 64 in 32\-bit mode, or 256 for 64\-bit environments\. This modifier does nothing if \fBzstd\fR is compiled without multithread support\. -.IP "\[ci]" 4 -\fB\-\-single\-thread\fR: Does not spawn a thread for compression, use a single thread for both I/O and compression\. In this mode, compression is serialized with I/O, which is slightly slower\. (This is different from \fB\-T1\fR, which spawns 1 compression thread in parallel of I/O)\. This mode is the only one available when multithread support is disabled\. Single\-thread mode features lower memory usage\. Final compressed result is slightly different from \fB\-T1\fR\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 +\fB\-\-single\-thread\fR: Use a single thread for both I/O and compression\. As compression is serialized with I/O, this can be slightly slower\. Single\-thread mode features significantly lower memory usage, which can be useful for systems with limited amount of memory, such as 32\-bit systems\. Note 1 : this mode is the only available one when multithread support is disabled\. Note 2 : this mode is different from \fB\-T1\fR, which spawns 1 compression thread in parallel with I/O\. Final compressed result is also slightly different from \fB\-T1\fR\. +. +.IP "\(bu" 4 \fB\-\-auto\-threads={physical,logical} (default: physical)\fR: When using a default amount of threads via \fB\-T0\fR, choose the default based on the number of detected physical or logical cores\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-adapt[=min=#,max=#]\fR : \fBzstd\fR will dynamically adapt compression level to perceived I/O conditions\. Compression level adaptation can be observed live by using command \fB\-v\fR\. Adaptation can be constrained between supplied \fBmin\fR and \fBmax\fR levels\. The feature works when combined with multi\-threading and \fB\-\-long\fR mode\. It does not work with \fB\-\-single\-thread\fR\. It sets window size to 8 MB by default (can be changed manually, see \fBwlog\fR)\. Due to the chaotic nature of dynamic adaptation, compressed result is not reproducible\. \fInote\fR : at the time of this writing, \fB\-\-adapt\fR can remain stuck at low speed when combined with multiple worker threads (>=2)\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-long[=#]\fR: enables long distance matching with \fB#\fR \fBwindowLog\fR, if \fB#\fR is not present it defaults to \fB27\fR\. This increases the window size (\fBwindowLog\fR) and memory usage for both the compressor and decompressor\. This setting is designed to improve the compression ratio for files with long matches at a large distance\. +. .IP Note: If \fBwindowLog\fR is set to larger than 27, \fB\-\-long=windowLog\fR or \fB\-\-memory=windowSize\fR needs to be passed to the decompressor\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-D DICT\fR: use \fBDICT\fR as Dictionary to compress or decompress FILE(s) -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-patch\-from FILE\fR: Specify the file to be used as a reference point for zstd\'s diff engine\. This is effectively dictionary compression with some convenient parameter selection, namely that windowSize > srcSize\. +. .IP Note: cannot use both this and \-D together Note: \fB\-\-long\fR mode will be automatically activated if chainLog < fileLog (fileLog being the windowLog required to cover the whole file)\. You can also manually force it\. Note: for all levels, you can use \-\-patch\-from in \-\-single\-thread mode to improve compression ratio at the cost of speed Note: for level 19, you can get increased compression ratio at the cost of speed by specifying \fB\-\-zstd=targetLength=\fR to be something large (i\.e\. 4096), and by setting a large \fB\-\-zstd=chainLog=\fR -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-rsyncable\fR : \fBzstd\fR will periodically synchronize the compression state to make the compressed file more rsync\-friendly\. There is a negligible impact to compression ratio, and the faster compression levels will see a small compression speed hit\. This feature does not work with \fB\-\-single\-thread\fR\. You probably don\'t want to use it with long range mode, since it will decrease the effectiveness of the synchronization points, but your mileage may vary\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-C\fR, \fB\-\-[no\-]check\fR: add integrity check computed from uncompressed data (default: enabled) -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-[no\-]content\-size\fR: enable / disable whether or not the original size of the file is placed in the header of the compressed file\. The default option is \-\-content\-size (meaning that the original size will be placed in the header)\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-no\-dictID\fR: do not store dictionary ID within frame header (dictionary compression)\. The decoder will have to rely on implicit knowledge about which dictionary to use, it won\'t be able to check if it\'s correct\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-M#\fR, \fB\-\-memory=#\fR: Set a memory usage limit\. By default, Zstandard uses 128 MB for decompression as the maximum amount of memory the decompressor is allowed to use, but you can override this manually if need be in either direction (i\.e\. you can increase or decrease it)\. +. .IP This is also used during compression when using with \-\-patch\-from=\. In this case, this parameter overrides that maximum size allowed for a dictionary\. (128 MB)\. +. .IP Additionally, this can be used to limit memory for dictionary training\. This parameter overrides the default limit of 2 GB\. zstd will load training samples up to the memory limit and ignore the rest\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-stream\-size=#\fR : Sets the pledged source size of input coming from a stream\. This value must be exact, as it will be included in the produced frame header\. Incorrect stream sizes will cause an error\. This information will be used to better optimize compression parameters, resulting in better and potentially faster compression, especially for smaller source sizes\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-size\-hint=#\fR: When handling input from a stream, \fBzstd\fR must guess how large the source size will be when optimizing compression parameters\. If the stream size is relatively small, this guess may be a poor one, resulting in a higher compression ratio than expected\. This feature allows for controlling the guess when needed\. Exact guesses result in better compression ratios\. Overestimates result in slightly degraded compression ratios, while underestimates may result in significant degradation\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-o FILE\fR: save result into \fBFILE\fR -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console); keep original files unchanged\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-[no\-]sparse\fR: enable / disable sparse FS support, to make files with many zeroes smaller on disk\. Creating sparse files may save disk space and speed up decompression by reducing the amount of disk I/O\. default: enabled when output is into a file, and disabled when output is stdout\. This setting overrides default and can force sparse mode over stdout\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-rm\fR: remove source file(s) after successful compression or decompression\. If used in combination with \-o, will trigger a confirmation prompt (which can be silenced with \-f), as this is a destructive operation\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-k\fR, \fB\-\-keep\fR: keep source file(s) after successful compression or decompression\. This is the default behavior\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-r\fR: operate recursively on directories\. It selects all files in the named directory and all its subdirectories\. This can be useful both to reduce command line typing, and to circumvent shell expansion limitations, when there are a lot of files and naming breaks the maximum size of a command line\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-filelist FILE\fR read a list of files to process as content from \fBFILE\fR\. Format is compatible with \fBls\fR output, with one file per line\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-output\-dir\-flat DIR\fR: resulting files are stored into target \fBDIR\fR directory, instead of same directory as origin file\. Be aware that this command can introduce name collision issues, if multiple files, from different directories, end up having the same name\. Collision resolution ensures first file with a given name will be present in \fBDIR\fR, while in combination with \fB\-f\fR, the last file will be present instead\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-output\-dir\-mirror DIR\fR: similar to \fB\-\-output\-dir\-flat\fR, the output files are stored underneath target \fBDIR\fR directory, but this option will replicate input directory hierarchy into output \fBDIR\fR\. +. .IP If input directory contains "\.\.", the files in this directory will be ignored\. If input directory is an absolute directory (i\.e\. "/var/tmp/abc"), it will be stored into the "output\-dir/var/tmp/abc"\. If there are multiple input files or directories, name collision resolution will follow the same rules as \fB\-\-output\-dir\-flat\fR\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-format=FORMAT\fR: compress and decompress in other formats\. If compiled with support, zstd can compress to or decompress from other compression algorithm formats\. Possibly available options are \fBzstd\fR, \fBgzip\fR, \fBxz\fR, \fBlzma\fR, and \fBlz4\fR\. If no such format is provided, \fBzstd\fR is the default\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-h\fR/\fB\-H\fR, \fB\-\-help\fR: display help/long help and exit -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-V\fR, \fB\-\-version\fR: display version number and exit\. Advanced : \fB\-vV\fR also displays supported formats\. \fB\-vvV\fR also displays POSIX support\. \fB\-q\fR will only display the version number, suitable for machine reading\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-v\fR, \fB\-\-verbose\fR: verbose mode, display more information -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-q\fR, \fB\-\-quiet\fR: suppress warnings, interactivity, and notifications\. specify twice to suppress errors too\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-no\-progress\fR: do not display the progress bar, but keep all other messages\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-show\-default\-cparams\fR: Shows the default compression parameters that will be used for a particular src file\. If the provided src file is not a regular file (e\.g\. named pipe), the cli will just output the default parameters\. That is, the parameters that are used when the src size is unknown\. -.IP "\[ci]" 4 +. +.IP "\(bu" 4 \fB\-\-\fR: All arguments after \fB\-\-\fR are treated as files +. .IP "" 0 +. .SS "gzip Operation modifiers" When invoked via a \fBgzip\fR symlink, \fBzstd\fR will support further options that intend to mimic the \fBgzip\fR behavior: +. .TP \fB\-n\fR, \fB\-\-no\-name\fR do not store the original filename and timestamps when compressing a file\. This is the default behavior and hence a no\-op\. +. .TP \fB\-\-best\fR alias to the option \fB\-9\fR\. +. .SS "Interactions with Environment Variables" Employing environment variables to set parameters has security implications\. Therefore, this avenue is intentionally limited\. Only \fBZSTD_CLEVEL\fR and \fBZSTD_NBTHREADS\fR are currently supported\. They set the compression level and number of threads to use during compression, respectively\. +. .P \fBZSTD_CLEVEL\fR can be used to set the level between 1 and 19 (the "normal" range)\. If the value of \fBZSTD_CLEVEL\fR is not a valid integer, it will be ignored with a warning message\. \fBZSTD_CLEVEL\fR just replaces the default compression level (\fB3\fR)\. +. .P \fBZSTD_NBTHREADS\fR can be used to set the number of threads \fBzstd\fR will attempt to use during compression\. If the value of \fBZSTD_NBTHREADS\fR is not a valid unsigned integer, it will be ignored with a warning message\. \fBZSTD_NBTHREADS\fR has a default value of (\fB1\fR), and is capped at ZSTDMT_NBWORKERS_MAX==200\. \fBzstd\fR must be compiled with multithread support for this to have any effect\. +. .P They can both be overridden by corresponding command line arguments: \fB\-#\fR for compression level and \fB\-T#\fR for number of compression threads\. +. .SH "DICTIONARY BUILDER" \fBzstd\fR offers \fIdictionary\fR compression, which greatly improves efficiency on small files and messages\. It\'s possible to train \fBzstd\fR with a set of samples, the result of which is saved into a file called a \fBdictionary\fR\. Then, during compression and decompression, reference the same dictionary, using command \fB\-D dictionaryFileName\fR\. Compression of small files similar to the sample set will be greatly improved\. +. .TP \fB\-\-train FILEs\fR Use FILEs as training set to create a dictionary\. The training set should ideally contain a lot of samples (> 100), and weight typically 100x the target dictionary size (for example, ~10 MB for a 100 KB dictionary)\. \fB\-\-train\fR can be combined with \fB\-r\fR to indicate a directory rather than listing all the files, which can be useful to circumvent shell expansion limits\. +. .IP Since dictionary compression is mostly effective for small files, the expectation is that the training set will only contain small files\. In the case where some samples happen to be large, only the first 128 KB of these samples will be used for training\. +. .IP \fB\-\-train\fR supports multithreading if \fBzstd\fR is compiled with threading support (default)\. Additional advanced parameters can be specified with \fB\-\-train\-fastcover\fR\. The legacy dictionary builder can be accessed with \fB\-\-train\-legacy\fR\. The slower cover dictionary builder can be accessed with \fB\-\-train\-cover\fR\. Default \fB\-\-train\fR is equivalent to \fB\-\-train\-fastcover=d=8,steps=4\fR\. +. .TP \fB\-o FILE\fR Dictionary saved into \fBFILE\fR (default name: dictionary)\. +. .TP \fB\-\-maxdict=#\fR Limit dictionary to specified size (default: 112640 bytes)\. As usual, quantities are expressed in bytes by default, and it\'s possible to employ suffixes (like \fBKB\fR or \fBMB\fR) to specify larger values\. +. .TP \fB\-#\fR Use \fB#\fR compression level during training (optional)\. Will generate statistics more tuned for selected compression level, resulting in a \fIsmall\fR compression ratio improvement for this level\. +. .TP \fB\-B#\fR Split input files into blocks of size # (default: no split) +. .TP \fB\-M#\fR, \fB\-\-memory=#\fR Limit the amount of sample data loaded for training (default: 2 GB)\. Note that the default (2 GB) is also the maximum\. This parameter can be useful in situations where the training set size is not well controlled and could be potentially very large\. Since speed of the training process is directly correlated to the size of the training sample set, a smaller sample set leads to faster training\. +. .IP In situations where the training set is larger than maximum memory, the CLI will randomly select samples among the available ones, up to the maximum allowed memory budget\. This is meant to improve dictionary relevance by mitigating the potential impact of clustering, such as selecting only files from the beginning of a list sorted by modification date, or sorted by alphabetical order\. The randomization process is deterministic, so training of the same list of files with the same parameters will lead to the creation of the same dictionary\. +. .TP \fB\-\-dictID=#\fR A dictionary ID is a locally unique ID\. The decoder will use this value to verify it is using the right dictionary\. By default, zstd will create a 4\-bytes random number ID\. It\'s possible to provide an explicit number ID instead\. It\'s up to the dictionary manager to not assign twice the same ID to 2 different dictionaries\. Note that short numbers have an advantage : an ID < 256 will only need 1 byte in the compressed frame header, and an ID < 65536 will only need 2 bytes\. This compares favorably to 4 bytes default\. +. .TP \fB\-\-train\-cover[=k#,d=#,steps=#,split=#,shrink[=#]]\fR Select parameters for the default dictionary builder algorithm named cover\. If \fId\fR is not specified, then it tries \fId\fR = 6 and \fId\fR = 8\. If \fIk\fR is not specified, then it tries \fIsteps\fR values in the range [50, 2000]\. If \fIsteps\fR is not specified, then the default value of 40 is used\. If \fIsplit\fR is not specified or split <= 0, then the default value of 100 is used\. Requires that \fId\fR <= \fIk\fR\. If \fIshrink\fR flag is not used, then the default value for \fIshrinkDict\fR of 0 is used\. If \fIshrink\fR is not specified, then the default value for \fIshrinkDictMaxRegression\fR of 1 is used\. +. .IP Selects segments of size \fIk\fR with highest score to put in the dictionary\. The score of a segment is computed by the sum of the frequencies of all the subsegments of size \fId\fR\. Generally \fId\fR should be in the range [6, 8], occasionally up to 16, but the algorithm will run faster with d <= \fI8\fR\. Good values for \fIk\fR vary widely based on the input data, but a safe range is [2 * \fId\fR, 2000]\. If \fIsplit\fR is 100, all input samples are used for both training and testing to find optimal \fId\fR and \fIk\fR to build dictionary\. Supports multithreading if \fBzstd\fR is compiled with threading support\. Having \fIshrink\fR enabled takes a truncated dictionary of minimum size and doubles in size until compression ratio of the truncated dictionary is at most \fIshrinkDictMaxRegression%\fR worse than the compression ratio of the largest dictionary\. +. .IP Examples: +. .IP \fBzstd \-\-train\-cover FILEs\fR +. .IP \fBzstd \-\-train\-cover=k=50,d=8 FILEs\fR +. .IP \fBzstd \-\-train\-cover=d=8,steps=500 FILEs\fR +. .IP \fBzstd \-\-train\-cover=k=50 FILEs\fR +. .IP \fBzstd \-\-train\-cover=k=50,split=60 FILEs\fR +. .IP \fBzstd \-\-train\-cover=shrink FILEs\fR +. .IP \fBzstd \-\-train\-cover=shrink=2 FILEs\fR +. .TP \fB\-\-train\-fastcover[=k#,d=#,f=#,steps=#,split=#,accel=#]\fR Same as cover but with extra parameters \fIf\fR and \fIaccel\fR and different default value of split If \fIsplit\fR is not specified, then it tries \fIsplit\fR = 75\. If \fIf\fR is not specified, then it tries \fIf\fR = 20\. Requires that 0 < \fIf\fR < 32\. If \fIaccel\fR is not specified, then it tries \fIaccel\fR = 1\. Requires that 0 < \fIaccel\fR <= 10\. Requires that \fId\fR = 6 or \fId\fR = 8\. +. .IP \fIf\fR is log of size of array that keeps track of frequency of subsegments of size \fId\fR\. The subsegment is hashed to an index in the range [0,2^\fIf\fR \- 1]\. It is possible that 2 different subsegments are hashed to the same index, and they are considered as the same subsegment when computing frequency\. Using a higher \fIf\fR reduces collision but takes longer\. +. .IP Examples: +. .IP \fBzstd \-\-train\-fastcover FILEs\fR +. .IP \fBzstd \-\-train\-fastcover=d=8,f=15,accel=2 FILEs\fR +. .TP \fB\-\-train\-legacy[=selectivity=#]\fR Use legacy dictionary builder algorithm with the given dictionary \fIselectivity\fR (default: 9)\. The smaller the \fIselectivity\fR value, the denser the dictionary, improving its efficiency but reducing its achievable maximum size\. \fB\-\-train\-legacy=s=#\fR is also accepted\. +. .IP Examples: +. .IP \fBzstd \-\-train\-legacy FILEs\fR +. .IP \fBzstd \-\-train\-legacy=selectivity=8 FILEs\fR +. .SH "BENCHMARK" +. .TP \fB\-b#\fR benchmark file(s) using compression level # +. .TP \fB\-e#\fR benchmark file(s) using multiple compression levels, from \fB\-b#\fR to \fB\-e#\fR (inclusive) +. .TP \fB\-i#\fR minimum evaluation time, in seconds (default: 3s), benchmark mode only +. .TP \fB\-B#\fR, \fB\-\-block\-size=#\fR cut file(s) into independent blocks of size # (default: no block) +. .TP \fB\-\-priority=rt\fR set process priority to real\-time +. .P \fBOutput Format:\fR CompressionLevel#Filename : InputSize \-> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed +. .P \fBMethodology:\fR For both compression and decompression speed, the entire input is compressed/decompressed in\-memory to measure speed\. A run lasts at least 1 sec, so when files are small, they are compressed/decompressed several times per run, in order to improve measurement accuracy\. +. .SH "ADVANCED COMPRESSION OPTIONS" -### \-B#: Specify the size of each compression job\. This parameter is only available when multi\-threading is enabled\. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads\. Default job size varies depending on compression level (generally \fB4 * windowSize\fR)\. \fB\-B#\fR makes it possible to manually select a custom size\. Note that job size must respect a minimum value which is enforced transparently\. This minimum is either 512 KB, or \fBoverlapSize\fR, whichever is largest\. Different job sizes will lead to non\-identical compressed frames\. +. +.SS "\-B#:" +Specify the size of each compression job\. This parameter is only available when multi\-threading is enabled\. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads\. Default job size varies depending on compression level (generally \fB4 * windowSize\fR)\. \fB\-B#\fR makes it possible to manually select a custom size\. Note that job size must respect a minimum value which is enforced transparently\. This minimum is either 512 KB, or \fBoverlapSize\fR, whichever is largest\. Different job sizes will lead to non\-identical compressed frames\. +. .SS "\-\-zstd[=options]:" \fBzstd\fR provides 22 predefined compression levels\. The selected or default predefined compression level can be changed with advanced compression options\. The \fIoptions\fR are provided as a comma\-separated list\. You may specify only the options you want to change and the rest will be taken from the selected or default compression level\. The list of available \fIoptions\fR: +. .TP \fBstrategy\fR=\fIstrat\fR, \fBstrat\fR=\fIstrat\fR Specify a strategy used by a match finder\. +. .IP There are 9 strategies numbered from 1 to 9, from faster to stronger: 1=ZSTD_fast, 2=ZSTD_dfast, 3=ZSTD_greedy, 4=ZSTD_lazy, 5=ZSTD_lazy2, 6=ZSTD_btlazy2, 7=ZSTD_btopt, 8=ZSTD_btultra, 9=ZSTD_btultra2\. +. .TP \fBwindowLog\fR=\fIwlog\fR, \fBwlog\fR=\fIwlog\fR Specify the maximum number of bits for a match distance\. +. .IP The higher number of increases the chance to find a match which usually improves compression ratio\. It also increases memory requirements for the compressor and decompressor\. The minimum \fIwlog\fR is 10 (1 KiB) and the maximum is 30 (1 GiB) on 32\-bit platforms and 31 (2 GiB) on 64\-bit platforms\. +. .IP Note: If \fBwindowLog\fR is set to larger than 27, \fB\-\-long=windowLog\fR or \fB\-\-memory=windowSize\fR needs to be passed to the decompressor\. +. .TP \fBhashLog\fR=\fIhlog\fR, \fBhlog\fR=\fIhlog\fR Specify the maximum number of bits for a hash table\. +. .IP Bigger hash tables cause fewer collisions which usually makes compression faster, but requires more memory during compression\. +. .IP The minimum \fIhlog\fR is 6 (64 B) and the maximum is 30 (1 GiB)\. +. .TP \fBchainLog\fR=\fIclog\fR, \fBclog\fR=\fIclog\fR Specify the maximum number of bits for a hash chain or a binary tree\. +. .IP Higher numbers of bits increases the chance to find a match which usually improves compression ratio\. It also slows down compression speed and increases memory requirements for compression\. This option is ignored for the ZSTD_fast strategy\. +. .IP The minimum \fIclog\fR is 6 (64 B) and the maximum is 29 (524 Mib) on 32\-bit platforms and 30 (1 Gib) on 64\-bit platforms\. +. .TP \fBsearchLog\fR=\fIslog\fR, \fBslog\fR=\fIslog\fR Specify the maximum number of searches in a hash chain or a binary tree using logarithmic scale\. +. .IP More searches increases the chance to find a match which usually increases compression ratio but decreases compression speed\. +. .IP The minimum \fIslog\fR is 1 and the maximum is \'windowLog\' \- 1\. +. .TP \fBminMatch\fR=\fImml\fR, \fBmml\fR=\fImml\fR Specify the minimum searched length of a match in a hash table\. +. .IP Larger search lengths usually decrease compression ratio but improve decompression speed\. +. .IP The minimum \fImml\fR is 3 and the maximum is 7\. +. .TP \fBtargetLength\fR=\fItlen\fR, \fBtlen\fR=\fItlen\fR The impact of this field vary depending on selected strategy\. +. .IP For ZSTD_btopt, ZSTD_btultra and ZSTD_btultra2, it specifies the minimum match length that causes match finder to stop searching\. A larger \fBtargetLength\fR usually improves compression ratio but decreases compression speed\. t For ZSTD_fast, it triggers ultra\-fast mode when > 0\. The value represents the amount of data skipped between match sampling\. Impact is reversed : a larger \fBtargetLength\fR increases compression speed but decreases compression ratio\. +. .IP For all other strategies, this field has no impact\. +. .IP The minimum \fItlen\fR is 0 and the maximum is 128 Kib\. +. .TP \fBoverlapLog\fR=\fIovlog\fR, \fBovlog\fR=\fIovlog\fR Determine \fBoverlapSize\fR, amount of data reloaded from previous job\. This parameter is only available when multithreading is enabled\. Reloading more data improves compression ratio, but decreases speed\. +. .IP The minimum \fIovlog\fR is 0, and the maximum is 9\. 1 means "no overlap", hence completely independent jobs\. 9 means "full overlap", meaning up to \fBwindowSize\fR is reloaded from previous job\. Reducing \fIovlog\fR by 1 reduces the reloaded amount by a factor 2\. For example, 8 means "windowSize/2", and 6 means "windowSize/8"\. Value 0 is special and means "default" : \fIovlog\fR is automatically determined by \fBzstd\fR\. In which case, \fIovlog\fR will range from 6 to 9, depending on selected \fIstrat\fR\. +. .TP \fBldmHashLog\fR=\fIlhlog\fR, \fBlhlog\fR=\fIlhlog\fR Specify the maximum size for a hash table used for long distance matching\. +. .IP This option is ignored unless long distance matching is enabled\. +. .IP Bigger hash tables usually improve compression ratio at the expense of more memory during compression and a decrease in compression speed\. +. .IP The minimum \fIlhlog\fR is 6 and the maximum is 30 (default: 20)\. +. .TP \fBldmMinMatch\fR=\fIlmml\fR, \fBlmml\fR=\fIlmml\fR Specify the minimum searched length of a match for long distance matching\. +. .IP This option is ignored unless long distance matching is enabled\. +. .IP Larger/very small values usually decrease compression ratio\. +. .IP The minimum \fIlmml\fR is 4 and the maximum is 4096 (default: 64)\. +. .TP \fBldmBucketSizeLog\fR=\fIlblog\fR, \fBlblog\fR=\fIlblog\fR Specify the size of each bucket for the hash table used for long distance matching\. +. .IP This option is ignored unless long distance matching is enabled\. +. .IP Larger bucket sizes improve collision resolution but decrease compression speed\. +. .IP The minimum \fIlblog\fR is 1 and the maximum is 8 (default: 3)\. +. .TP \fBldmHashRateLog\fR=\fIlhrlog\fR, \fBlhrlog\fR=\fIlhrlog\fR Specify the frequency of inserting entries into the long distance matching hash table\. +. .IP This option is ignored unless long distance matching is enabled\. +. .IP Larger values will improve compression speed\. Deviating far from the default value will likely result in a decrease in compression ratio\. +. .IP The default value is \fBwlog \- lhlog\fR\. +. .SS "Example" The following parameters sets advanced compression options to something similar to predefined level 19 for files bigger than 256 KB: +. .P \fB\-\-zstd\fR=wlog=23,clog=23,hlog=22,slog=6,mml=3,tlen=48,strat=6 +. .SH "BUGS" Report bugs at: https://github\.com/facebook/zstd/issues +. .SH "AUTHOR" Yann Collet diff --git a/programs/zstd.1.md b/programs/zstd.1.md index d415211d6..c3a878176 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -118,12 +118,13 @@ the last one takes effect. which is either 64 in 32-bit mode, or 256 for 64-bit environments. This modifier does nothing if `zstd` is compiled without multithread support. * `--single-thread`: - Does not spawn a thread for compression, use a single thread for both I/O and compression. - In this mode, compression is serialized with I/O, which is slightly slower. - (This is different from `-T1`, which spawns 1 compression thread in parallel of I/O). - This mode is the only one available when multithread support is disabled. - Single-thread mode features lower memory usage. - Final compressed result is slightly different from `-T1`. + Use a single thread for both I/O and compression. + As compression is serialized with I/O, this can be slightly slower. + Single-thread mode features significantly lower memory usage, + which can be useful for systems with limited amount of memory, such as 32-bit systems. + Note 1 : this mode is the only available one when multithread support is disabled. + Note 2 : this mode is different from `-T1`, which spawns 1 compression thread in parallel with I/O. + Final compressed result is also slightly different from `-T1`. * `--auto-threads={physical,logical} (default: physical)`: When using a default amount of threads via `-T0`, choose the default based on the number of detected physical or logical cores. From 31bd6402c63a33e81513de6511c6447c63456625 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 9 Jun 2022 11:39:30 -0400 Subject: [PATCH 152/472] Bugfix for huge dictionaries --- lib/compress/zstd_compress.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index e43bbec44..6fe46f5b7 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -4219,7 +4219,7 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, * Dictionaries right at the edge will immediately trigger overflow * correction, but I don't want to insert extra constraints here. */ - U32 const maxDictSize = ZSTD_CURRENT_MAX - 1; + U32 const maxDictSize = ZSTD_CURRENT_MAX - ZSTD_WINDOW_START_INDEX; /* We must have cleared our windows when our source is this large. */ assert(ZSTD_window_isEmpty(ms->window)); if (loadLdmDict) From 05f3f415ce3ca73abc82936752829a3ee75242e2 Mon Sep 17 00:00:00 2001 From: Daniel Kutenin Date: Mon, 13 Jun 2022 09:16:24 +0100 Subject: [PATCH 153/472] Fix big endian ARM NEON path It is not using the NEON acceleration but the bit grouping was applied --- lib/compress/zstd_lazy.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/compress/zstd_lazy.c b/lib/compress/zstd_lazy.c index 6f8d11e14..e54b43c0c 100644 --- a/lib/compress/zstd_lazy.c +++ b/lib/compress/zstd_lazy.c @@ -965,6 +965,10 @@ ZSTD_row_matchMaskGroupWidth(const U32 rowEntries) assert(rowEntries <= ZSTD_ROW_HASH_MAX_ENTRIES); (void)rowEntries; #if defined(ZSTD_ARCH_ARM_NEON) + /* NEON path only works for little endian */ + if (!MEM_isLittleEndian()) { + return 1; + } if (rowEntries == 16) { return 4; } From e0c4863c5c81c7aecdb7e1560e081346747a495b Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Mon, 13 Jun 2022 17:23:33 -0700 Subject: [PATCH 154/472] largeNbDicts bugfix + improvements --- contrib/largeNbDicts/largeNbDicts.c | 30 +++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index ae5383d25..034753d3c 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -654,7 +654,8 @@ static int benchMem(slice_collection_t dstBlocks, slice_collection_t srcBlocks, ddict_collection_t ddictionaries, cdict_collection_t cdictionaries, - unsigned nbRounds, int benchCompression) + unsigned nbRounds, int benchCompression, + const char* exeName) { assert(dstBlocks.nbSlices == srcBlocks.nbSlices); @@ -703,6 +704,22 @@ static int benchMem(slice_collection_t dstBlocks, } DISPLAY("\n"); + char* csvFileName = malloc(strlen(exeName) + 5); + strcpy(csvFileName, exeName); + strcat(csvFileName, ".csv"); + FILE* csvFile = fopen(csvFileName, "r"); + if (!csvFile) { + csvFile = fopen(csvFileName, "wt"); + assert(csvFile); + fprintf(csvFile, "%s\n", exeName); + } else { + csvFile = fopen(csvFileName, "at"); + assert(csvFile); + } + fprintf(csvFile, "%.1f\n", bestSpeed); + fclose(csvFile); + free(csvFileName); + freeDecompressInstructions(di); freeCompressInstructions(ci); BMK_freeTimedFnState(benchState); @@ -721,7 +738,8 @@ int bench(const char** fileNameTable, unsigned nbFiles, size_t blockSize, int clevel, unsigned nbDictMax, unsigned nbBlocks, unsigned nbRounds, int benchCompression, - ZSTD_dictContentType_e dictContentType, ZSTD_CCtx_params* cctxParams) + ZSTD_dictContentType_e dictContentType, ZSTD_CCtx_params* cctxParams, + const char* exeName) { int result = 0; @@ -806,7 +824,7 @@ int bench(const char** fileNameTable, unsigned nbFiles, CONTROL(ddictionaries.ddicts != NULL); if (benchCompression) { - size_t const dictMem = ZSTD_estimateCDictSize(dictBuffer.size, DICT_LOAD_METHOD); + size_t const dictMem = ZSTD_sizeof_CDict(cdictionaries.cdicts[0]); size_t const allDictMem = dictMem * nbDicts; DISPLAYLEVEL(3, "generating %u dictionaries, using %.1f MB of memory \n", nbDicts, (double)allDictMem / (1 MB)); @@ -816,7 +834,7 @@ int bench(const char** fileNameTable, unsigned nbFiles, buffer_collection_t resultCollection = createBufferCollection_fromSliceCollection(srcSlices); CONTROL(resultCollection.buffer.ptr != NULL); - result = benchMem(dstSlices, resultCollection.slices, ddictionaries, cdictionaries, nbRounds, benchCompression); + result = benchMem(dstSlices, resultCollection.slices, ddictionaries, cdictionaries, nbRounds, benchCompression, exeName); freeBufferCollection(resultCollection); } else { @@ -830,7 +848,7 @@ int bench(const char** fileNameTable, unsigned nbFiles, buffer_collection_t resultCollection = createBufferCollection_fromSliceCollectionSizes(srcSlices); CONTROL(resultCollection.buffer.ptr != NULL); - result = benchMem(resultCollection.slices, dstSlices, ddictionaries, cdictionaries, nbRounds, benchCompression); + result = benchMem(resultCollection.slices, dstSlices, ddictionaries, cdictionaries, nbRounds, benchCompression, exeName); freeBufferCollection(resultCollection); } @@ -988,7 +1006,7 @@ int main (int argc, const char** argv) ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_nbWorkers, 0); ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_forceAttachDict, dictAttachPref); - int result = bench(filenameTable->fileNames, (unsigned)filenameTable->tableSize, dictionary, blockSize, cLevel, nbDicts, nbBlocks, nbRounds, benchCompression, dictContentType, cctxParams); + int result = bench(filenameTable->fileNames, (unsigned)filenameTable->tableSize, dictionary, blockSize, cLevel, nbDicts, nbBlocks, nbRounds, benchCompression, dictContentType, cctxParams, exeName); UTIL_freeFileNamesTable(filenameTable); free(nameTable); From f7ebbcd0cc090d8012c906a009521558f70245a7 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 14 Jun 2022 14:52:51 -0700 Subject: [PATCH 155/472] Support advanced API so forceCopy/forceAttach works properly --- contrib/largeNbDicts/largeNbDicts.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index 034753d3c..9be059a6e 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -577,11 +577,12 @@ typedef struct { cdict_collection_t dictionaries; } compressInstructions; -compressInstructions createCompressInstructions(cdict_collection_t dictionaries) +compressInstructions createCompressInstructions(cdict_collection_t dictionaries, ZSTD_CCtx_params* cctxParams) { compressInstructions ci; ci.cctx = ZSTD_createCCtx(); CONTROL(ci.cctx != NULL); + ZSTD_CCtx_setParametersUsingCCtxParams(ci.cctx, cctxParams); ci.nbDicts = dictionaries.nbCDict; ci.dictNb = 0; ci.dictionaries = dictionaries; @@ -622,10 +623,10 @@ size_t compress(const void* src, size_t srcSize, void* dst, size_t dstCapacity, compressInstructions* const ci = (compressInstructions*) payload; (void)dstCapacity; - ZSTD_compress_usingCDict(ci->cctx, - dst, srcSize, - src, srcSize, - ci->dictionaries.cdicts[ci->dictNb]); + ZSTD_CCtx_refCDict(ci->cctx, ci->dictionaries.cdicts[ci->dictNb]); + ZSTD_compress2(ci->cctx, + dst, srcSize, + src, srcSize); ci->dictNb = ci->dictNb + 1; if (ci->dictNb >= ci->nbDicts) ci->dictNb = 0; @@ -655,9 +656,10 @@ static int benchMem(slice_collection_t dstBlocks, ddict_collection_t ddictionaries, cdict_collection_t cdictionaries, unsigned nbRounds, int benchCompression, - const char* exeName) + const char* exeName, ZSTD_CCtx_params* cctxParams) { assert(dstBlocks.nbSlices == srcBlocks.nbSlices); + if (benchCompression) assert(cctxParams); unsigned const ms_per_round = RUN_TIME_DEFAULT_MS; unsigned const total_time_ms = nbRounds * ms_per_round; @@ -668,7 +670,7 @@ static int benchMem(slice_collection_t dstBlocks, BMK_createTimedFnState(total_time_ms, ms_per_round); decompressInstructions di = createDecompressInstructions(ddictionaries); - compressInstructions ci = createCompressInstructions(cdictionaries); + compressInstructions ci = createCompressInstructions(cdictionaries, cctxParams); void* payload = benchCompression ? (void*)&ci : (void*)&di; BMK_benchParams_t const bp = { .benchFn = benchCompression ? compress : decompress, @@ -834,7 +836,7 @@ int bench(const char** fileNameTable, unsigned nbFiles, buffer_collection_t resultCollection = createBufferCollection_fromSliceCollection(srcSlices); CONTROL(resultCollection.buffer.ptr != NULL); - result = benchMem(dstSlices, resultCollection.slices, ddictionaries, cdictionaries, nbRounds, benchCompression, exeName); + result = benchMem(dstSlices, resultCollection.slices, ddictionaries, cdictionaries, nbRounds, benchCompression, exeName, cctxParams); freeBufferCollection(resultCollection); } else { @@ -848,7 +850,7 @@ int bench(const char** fileNameTable, unsigned nbFiles, buffer_collection_t resultCollection = createBufferCollection_fromSliceCollectionSizes(srcSlices); CONTROL(resultCollection.buffer.ptr != NULL); - result = benchMem(resultCollection.slices, dstSlices, ddictionaries, cdictionaries, nbRounds, benchCompression, exeName); + result = benchMem(resultCollection.slices, dstSlices, ddictionaries, cdictionaries, nbRounds, benchCompression, exeName, NULL); freeBufferCollection(resultCollection); } From 2bbdc9f40e6663311028dec241cdc6ab3b5c7e33 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 14 Jun 2022 14:57:54 -0700 Subject: [PATCH 156/472] Fix FILE handle leak --- contrib/largeNbDicts/largeNbDicts.c | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index 9be059a6e..a87220b79 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -715,6 +715,7 @@ static int benchMem(slice_collection_t dstBlocks, assert(csvFile); fprintf(csvFile, "%s\n", exeName); } else { + free(csvFileName); csvFile = fopen(csvFileName, "at"); assert(csvFile); } From 24364057bcb6b29a65c6ab91a3da6a32add141eb Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 14 Jun 2022 19:18:49 -0400 Subject: [PATCH 157/472] fix typo Co-authored-by: Nick Terrell --- contrib/largeNbDicts/largeNbDicts.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index a87220b79..25b154c30 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -715,7 +715,7 @@ static int benchMem(slice_collection_t dstBlocks, assert(csvFile); fprintf(csvFile, "%s\n", exeName); } else { - free(csvFileName); + fclose(csvFile); csvFile = fopen(csvFileName, "at"); assert(csvFile); } From b33ef91694f0b8b13471da0a39e584c4000f89fe Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 19 Jun 2022 11:12:16 -0700 Subject: [PATCH 158/472] updated documentation regarding build systems --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 69720ba2c..da8622d72 100644 --- a/README.md +++ b/README.md @@ -124,14 +124,23 @@ Dictionary gains are mostly effective in the first few KB. Then, the compression ## Build instructions +`make` is the officially maintained build system of this project. +All other build systems are "compatible" and 3rd-party maintained, +they may feature small differences in advanced options. +When your system allows it, prefer using `make` to build `zstd` and `libzstd`. + ### Makefile If your system is compatible with standard `make` (or `gmake`), invoking `make` in root directory will generate `zstd` cli in root directory. +It will also create `libzstd` into `lib/`. Other available options include: - `make install` : create and install zstd cli, library and man pages -- `make check` : create and run `zstd`, tests its behavior on local platform +- `make check` : create and run `zstd`, test its behavior on local platform + +The `Makefile` follows the [GNU Standard Makefile conventions](https://www.gnu.org/prep/standards/html_node/Makefile-Conventions.html), +allowing staged install, standard flags, directory variables and command variables. ### cmake From 574ecbb0fcbddd1937d104d199247052042d9a16 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 19 Jun 2022 11:38:06 -0700 Subject: [PATCH 159/472] display a warning message when using C90 clock_t for MT speed measurements. --- programs/benchzstd.c | 9 ++++++++- programs/timefn.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/programs/benchzstd.c b/programs/benchzstd.c index fa2659efb..6ceca020c 100644 --- a/programs/benchzstd.c +++ b/programs/benchzstd.c @@ -13,7 +13,7 @@ * Tuning parameters ****************************************/ #ifndef BMK_TIMETEST_DEFAULT_S /* default minimum time per test */ -#define BMK_TIMETEST_DEFAULT_S 3 +# define BMK_TIMETEST_DEFAULT_S 3 #endif @@ -387,6 +387,13 @@ BMK_benchMemAdvancedNoAlloc( RDG_genBuffer(compressedBuffer, maxCompressedSize, 0.10, 0.50, 1); } +#if defined(UTIL_TIME_USES_C90_CLOCK) + if (adv->nbWorkers > 1) { + OUTPUTLEVEL(2, "Warning : time measurements restricted to C90 clock_t. \n") + OUTPUTLEVEL(2, "Warning : using C90 clock_t leads to incorrect measurements in multithreading mode. \n") + } +#endif + /* Bench */ { U64 const crcOrig = (adv->mode == BMK_decodeOnly) ? 0 : XXH64(srcBuffer, srcSize, 0); # define NB_MARKS 4 diff --git a/programs/timefn.h b/programs/timefn.h index 3fcd78a28..8ba8ed787 100644 --- a/programs/timefn.h +++ b/programs/timefn.h @@ -65,6 +65,7 @@ extern "C" { #else /* relies on standard C90 (note : clock_t measurements can be wrong when using multi-threading) */ + #define UTIL_TIME_USES_C90_CLOCK typedef clock_t UTIL_time_t; #define UTIL_TIME_INITIALIZER 0 From eceecc5b2cade40e2ffe7e4ff4c7d2e16883961a Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Sun, 19 Jun 2022 14:52:32 -0700 Subject: [PATCH 160/472] removed explicit compilation standard from cmake script it's not expected to be useful and can actually lead to subtle side effects such as #3163. --- .../cmake/CMakeModules/AddZstdCompilationFlags.cmake | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake b/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake index e23b9d603..8d04458c3 100644 --- a/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake +++ b/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake @@ -22,10 +22,12 @@ endfunction() macro(ADD_ZSTD_COMPILATION_FLAGS) if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" OR MINGW) #Not only UNIX but also WIN32 for MinGW - #Set c++11 by default - EnableCompilerFlag("-std=c++11" false true) - #Set c99 by default - EnableCompilerFlag("-std=c99" true false) + # It's possible to select the exact standard used for compilation. + # It's not necessary, but can be employed for specific purposes. + # Note that zstd source code is compatible with both C++98 and above + # and C-gnu90 (c90 + long long + variadic macros ) and above + # EnableCompilerFlag("-std=c++11" false true) # Set C++ compilation to c++11 standard + # EnableCompilerFlag("-std=c99" true false) # Set C compiation to c99 standard if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND MSVC) # clang-cl normally maps -Wall to -Weverything. EnableCompilerFlag("/clang:-Wall" true true) @@ -48,7 +50,7 @@ macro(ADD_ZSTD_COMPILATION_FLAGS) if (CMAKE_GENERATOR MATCHES "Visual Studio" AND ACTIVATE_MULTITHREADED_COMPILATION) EnableCompilerFlag("/MP" true true) endif () - + # UNICODE SUPPORT EnableCompilerFlag("/D_UNICODE" true true) EnableCompilerFlag("/DUNICODE" true true) From 15f3605135ef7647402c1639af3b50de30e613af Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 20 Jun 2022 15:02:41 -0700 Subject: [PATCH 161/472] removed gnu99 statement from meson recipe --- build/meson/meson.build | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build/meson/meson.build b/build/meson/meson.build index e0ea3dff9..f264760a3 100644 --- a/build/meson/meson.build +++ b/build/meson/meson.build @@ -12,7 +12,10 @@ project('zstd', ['c', 'cpp'], license: ['BSD', 'GPLv2'], default_options : [ - 'c_std=gnu99', + # There shouldn't be any need to force a C standard convention for zstd + # but in case one would want that anyway, this can be done here. + # 'c_std=gnu99', + # c++11 standard is useful for pzstd 'cpp_std=c++11', 'buildtype=release', 'warning_level=3', From f6ef14329f396eb8b2c1290790e7547d070d9511 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 21 Jun 2022 14:27:19 -0700 Subject: [PATCH 162/472] "Short cache" optimization for level 1-4 DMS (+5-30% compression speed) (#3152) * first attempt at fast DMS short cache * significant wins for some scenarios * fix all clang regressions * nits * fix 1.5% gcc11 regression on hot 110Kdict scenario * fix CI * nit * Add tags to doublefast hash table * use tags in doublefast DMS * Fix CI * Clean up some hardcoded logic / constants * Switch forCCtx to an enum * nit * add short cache to ip+1 long search * Move tag size into hashLog * Minor nits * Truncate dictionaries greater than 16MB in short cache mode * Helper function for tag comparison * Cap short cache hashLog at 24 to prevent overflow * size_t dictTagsMatch -> int dictTagsMatch * nit * Clean up and comment dictionary truncation * Move ZSTD_tableFillPurpose_e next to ZSTD_dictTableLoadMethod_e * Comment and expand helper functions * Asserts and documentation * nit --- lib/compress/zstd_compress.c | 94 +++++++++++++++++------ lib/compress/zstd_compress_internal.h | 53 +++++++++++-- lib/compress/zstd_double_fast.c | 80 ++++++++++++++++---- lib/compress/zstd_double_fast.h | 3 +- lib/compress/zstd_fast.c | 105 ++++++++++++++++++++------ lib/compress/zstd_fast.h | 3 +- lib/compress/zstd_ldm.c | 4 +- 7 files changed, 273 insertions(+), 69 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index ec2a2fe27..46a9dbe66 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -275,6 +275,12 @@ static ZSTD_paramSwitch_e ZSTD_resolveEnableLdm(ZSTD_paramSwitch_e mode, return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 27) ? ZSTD_ps_enable : ZSTD_ps_disable; } +/* Returns 1 if compression parameters are such that CDict hashtable and chaintable indices are tagged. + * If so, the tags need to be removed in ZSTD_resetCCtx_byCopyingCDict. */ +static int ZSTD_CDictIndicesAreTagged(const ZSTD_compressionParameters* const cParams) { + return cParams->strategy == ZSTD_fast || cParams->strategy == ZSTD_dfast; +} + static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams( ZSTD_compressionParameters cParams) { @@ -1367,6 +1373,13 @@ ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar, if (cPar.windowLog < ZSTD_WINDOWLOG_ABSOLUTEMIN) cPar.windowLog = ZSTD_WINDOWLOG_ABSOLUTEMIN; /* minimum wlog required for valid frame header */ + if (mode == ZSTD_cpm_createCDict && ZSTD_CDictIndicesAreTagged(&cPar)) { + U32 const maxShortCacheHashLog = 32 - ZSTD_SHORT_CACHE_TAG_BITS; + if (cPar.hashLog > maxShortCacheHashLog) { + cPar.hashLog = maxShortCacheHashLog; + } + } + return cPar; } @@ -2096,6 +2109,22 @@ ZSTD_resetCCtx_byAttachingCDict(ZSTD_CCtx* cctx, return 0; } +static void ZSTD_copyCDictTableIntoCCtx(U32* dst, U32 const* src, size_t tableSize, + ZSTD_compressionParameters const* cParams) { + if (ZSTD_CDictIndicesAreTagged(cParams)){ + /* Remove tags from the CDict table if they are present. + * See docs on "short cache" in zstd_compress_internal.h for context. */ + size_t i; + for (i = 0; i < tableSize; i++) { + U32 const taggedIndex = src[i]; + U32 const index = taggedIndex >> ZSTD_SHORT_CACHE_TAG_BITS; + dst[i] = index; + } + } else { + ZSTD_memcpy(dst, src, tableSize * sizeof(U32)); + } +} + static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict, ZSTD_CCtx_params params, @@ -2131,14 +2160,15 @@ static size_t ZSTD_resetCCtx_byCopyingCDict(ZSTD_CCtx* cctx, : 0; size_t const hSize = (size_t)1 << cdict_cParams->hashLog; - ZSTD_memcpy(cctx->blockState.matchState.hashTable, - cdict->matchState.hashTable, - hSize * sizeof(U32)); + ZSTD_copyCDictTableIntoCCtx(cctx->blockState.matchState.hashTable, + cdict->matchState.hashTable, + hSize, cdict_cParams); + /* Do not copy cdict's chainTable if cctx has parameters such that it would not use chainTable */ if (ZSTD_allocateChainTable(cctx->appliedParams.cParams.strategy, cctx->appliedParams.useRowMatchFinder, 0 /* forDDSDict */)) { - ZSTD_memcpy(cctx->blockState.matchState.chainTable, - cdict->matchState.chainTable, - chainSize * sizeof(U32)); + ZSTD_copyCDictTableIntoCCtx(cctx->blockState.matchState.chainTable, + cdict->matchState.chainTable, + chainSize, cdict_cParams); } /* copy tag table */ if (ZSTD_rowMatchFinderUsed(cdict_cParams->strategy, cdict->useRowMatchFinder)) { @@ -4205,7 +4235,8 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, ZSTD_cwksp* ws, ZSTD_CCtx_params const* params, const void* src, size_t srcSize, - ZSTD_dictTableLoadMethod_e dtlm) + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp) { const BYTE* ip = (const BYTE*) src; const BYTE* const iend = ip + srcSize; @@ -4214,22 +4245,37 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, /* Assert that the ms params match the params we're being given */ ZSTD_assertEqualCParams(params->cParams, ms->cParams); - if (srcSize > ZSTD_CHUNKSIZE_MAX) { + { /* Ensure large dictionaries can't cause index overflow */ + /* Allow the dictionary to set indices up to exactly ZSTD_CURRENT_MAX. * Dictionaries right at the edge will immediately trigger overflow * correction, but I don't want to insert extra constraints here. */ - U32 const maxDictSize = ZSTD_CURRENT_MAX - ZSTD_WINDOW_START_INDEX; - /* We must have cleared our windows when our source is this large. */ - assert(ZSTD_window_isEmpty(ms->window)); - if (loadLdmDict) - assert(ZSTD_window_isEmpty(ls->window)); + U32 maxDictSize = ZSTD_CURRENT_MAX - ZSTD_WINDOW_START_INDEX; + + int const CDictTaggedIndices = ZSTD_CDictIndicesAreTagged(¶ms->cParams); + if (CDictTaggedIndices && tfp == ZSTD_tfp_forCDict) { + /* Some dictionary matchfinders in zstd use "short cache", + * which treats the lower ZSTD_SHORT_CACHE_TAG_BITS of each + * CDict hashtable entry as a tag rather than as part of an index. + * When short cache is used, we need to truncate the dictionary + * so that its indices don't overlap with the tag. */ + U32 const shortCacheMaxDictSize = (1u << (32 - ZSTD_SHORT_CACHE_TAG_BITS)) - ZSTD_WINDOW_START_INDEX; + maxDictSize = MIN(maxDictSize, shortCacheMaxDictSize); + assert(!loadLdmDict); + } + /* If the dictionary is too large, only load the suffix of the dictionary. */ if (srcSize > maxDictSize) { ip = iend - maxDictSize; src = ip; srcSize = maxDictSize; - } + } } + + if (srcSize > ZSTD_CHUNKSIZE_MAX) { + /* We must have cleared our windows when our source is this large. */ + assert(ZSTD_window_isEmpty(ms->window)); + if (loadLdmDict) assert(ZSTD_window_isEmpty(ls->window)); } DEBUGLOG(4, "ZSTD_loadDictionaryContent(): useRowMatchFinder=%d", (int)params->useRowMatchFinder); @@ -4252,10 +4298,10 @@ static size_t ZSTD_loadDictionaryContent(ZSTD_matchState_t* ms, switch(params->cParams.strategy) { case ZSTD_fast: - ZSTD_fillHashTable(ms, iend, dtlm); + ZSTD_fillHashTable(ms, iend, dtlm, tfp); break; case ZSTD_dfast: - ZSTD_fillDoubleHashTable(ms, iend, dtlm); + ZSTD_fillDoubleHashTable(ms, iend, dtlm, tfp); break; case ZSTD_greedy: @@ -4421,6 +4467,7 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, ZSTD_CCtx_params const* params, const void* dict, size_t dictSize, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp, void* workspace) { const BYTE* dictPtr = (const BYTE*)dict; @@ -4439,7 +4486,7 @@ static size_t ZSTD_loadZstdDictionary(ZSTD_compressedBlockState_t* bs, { size_t const dictContentSize = (size_t)(dictEnd - dictPtr); FORWARD_IF_ERROR(ZSTD_loadDictionaryContent( - ms, NULL, ws, params, dictPtr, dictContentSize, dtlm), ""); + ms, NULL, ws, params, dictPtr, dictContentSize, dtlm, tfp), ""); } return dictID; } @@ -4455,6 +4502,7 @@ ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, const void* dict, size_t dictSize, ZSTD_dictContentType_e dictContentType, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp, void* workspace) { DEBUGLOG(4, "ZSTD_compress_insertDictionary (dictSize=%u)", (U32)dictSize); @@ -4467,13 +4515,13 @@ ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, /* dict restricted modes */ if (dictContentType == ZSTD_dct_rawContent) - return ZSTD_loadDictionaryContent(ms, ls, ws, params, dict, dictSize, dtlm); + return ZSTD_loadDictionaryContent(ms, ls, ws, params, dict, dictSize, dtlm, tfp); if (MEM_readLE32(dict) != ZSTD_MAGIC_DICTIONARY) { if (dictContentType == ZSTD_dct_auto) { DEBUGLOG(4, "raw content dictionary detected"); return ZSTD_loadDictionaryContent( - ms, ls, ws, params, dict, dictSize, dtlm); + ms, ls, ws, params, dict, dictSize, dtlm, tfp); } RETURN_ERROR_IF(dictContentType == ZSTD_dct_fullDict, dictionary_wrong, ""); assert(0); /* impossible */ @@ -4481,7 +4529,7 @@ ZSTD_compress_insertDictionary(ZSTD_compressedBlockState_t* bs, /* dict as full zstd dictionary */ return ZSTD_loadZstdDictionary( - bs, ms, ws, params, dict, dictSize, dtlm, workspace); + bs, ms, ws, params, dict, dictSize, dtlm, tfp, workspace); } #define ZSTD_USE_CDICT_PARAMS_SRCSIZE_CUTOFF (128 KB) @@ -4524,11 +4572,11 @@ static size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx, cctx->blockState.prevCBlock, &cctx->blockState.matchState, &cctx->ldmState, &cctx->workspace, &cctx->appliedParams, cdict->dictContent, cdict->dictContentSize, cdict->dictContentType, dtlm, - cctx->entropyWorkspace) + ZSTD_tfp_forCCtx, cctx->entropyWorkspace) : ZSTD_compress_insertDictionary( cctx->blockState.prevCBlock, &cctx->blockState.matchState, &cctx->ldmState, &cctx->workspace, &cctx->appliedParams, dict, dictSize, - dictContentType, dtlm, cctx->entropyWorkspace); + dictContentType, dtlm, ZSTD_tfp_forCCtx, cctx->entropyWorkspace); FORWARD_IF_ERROR(dictID, "ZSTD_compress_insertDictionary failed"); assert(dictID <= UINT_MAX); cctx->dictID = (U32)dictID; @@ -4832,7 +4880,7 @@ static size_t ZSTD_initCDict_internal( { size_t const dictID = ZSTD_compress_insertDictionary( &cdict->cBlockState, &cdict->matchState, NULL, &cdict->workspace, ¶ms, cdict->dictContent, cdict->dictContentSize, - dictContentType, ZSTD_dtlm_full, cdict->entropyWorkspace); + dictContentType, ZSTD_dtlm_full, ZSTD_tfp_forCDict, cdict->entropyWorkspace); FORWARD_IF_ERROR(dictID, "ZSTD_compress_insertDictionary failed"); assert(dictID <= (size_t)(U32)-1); cdict->dictID = (U32)dictID; diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index bbae53303..870bcc8be 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -434,6 +434,7 @@ struct ZSTD_CCtx_s { }; typedef enum { ZSTD_dtlm_fast, ZSTD_dtlm_full } ZSTD_dictTableLoadMethod_e; +typedef enum { ZSTD_tfp_forCCtx, ZSTD_tfp_forCDict } ZSTD_tableFillPurpose_e; typedef enum { ZSTD_noDict = 0, @@ -745,32 +746,36 @@ ZSTD_count_2segments(const BYTE* ip, const BYTE* match, * Hashes ***************************************/ static const U32 prime3bytes = 506832829U; -static U32 ZSTD_hash3(U32 u, U32 h) { return ((u << (32-24)) * prime3bytes) >> (32-h) ; } +static U32 ZSTD_hash3(U32 u, U32 h) { assert(h <= 32); return ((u << (32-24)) * prime3bytes) >> (32-h) ; } MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h); } /* only in zstd_opt.h */ static const U32 prime4bytes = 2654435761U; -static U32 ZSTD_hash4(U32 u, U32 h) { return (u * prime4bytes) >> (32-h) ; } +static U32 ZSTD_hash4(U32 u, U32 h) { assert(h <= 32); return (u * prime4bytes) >> (32-h) ; } static size_t ZSTD_hash4Ptr(const void* ptr, U32 h) { return ZSTD_hash4(MEM_read32(ptr), h); } static const U64 prime5bytes = 889523592379ULL; -static size_t ZSTD_hash5(U64 u, U32 h) { return (size_t)(((u << (64-40)) * prime5bytes) >> (64-h)) ; } +static size_t ZSTD_hash5(U64 u, U32 h) { assert(h <= 64); return (size_t)(((u << (64-40)) * prime5bytes) >> (64-h)) ; } static size_t ZSTD_hash5Ptr(const void* p, U32 h) { return ZSTD_hash5(MEM_readLE64(p), h); } static const U64 prime6bytes = 227718039650203ULL; -static size_t ZSTD_hash6(U64 u, U32 h) { return (size_t)(((u << (64-48)) * prime6bytes) >> (64-h)) ; } +static size_t ZSTD_hash6(U64 u, U32 h) { assert(h <= 64); return (size_t)(((u << (64-48)) * prime6bytes) >> (64-h)) ; } static size_t ZSTD_hash6Ptr(const void* p, U32 h) { return ZSTD_hash6(MEM_readLE64(p), h); } static const U64 prime7bytes = 58295818150454627ULL; -static size_t ZSTD_hash7(U64 u, U32 h) { return (size_t)(((u << (64-56)) * prime7bytes) >> (64-h)) ; } +static size_t ZSTD_hash7(U64 u, U32 h) { assert(h <= 64); return (size_t)(((u << (64-56)) * prime7bytes) >> (64-h)) ; } static size_t ZSTD_hash7Ptr(const void* p, U32 h) { return ZSTD_hash7(MEM_readLE64(p), h); } static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL; -static size_t ZSTD_hash8(U64 u, U32 h) { return (size_t)(((u) * prime8bytes) >> (64-h)) ; } +static size_t ZSTD_hash8(U64 u, U32 h) { assert(h <= 64); return (size_t)(((u) * prime8bytes) >> (64-h)) ; } static size_t ZSTD_hash8Ptr(const void* p, U32 h) { return ZSTD_hash8(MEM_readLE64(p), h); } MEM_STATIC FORCE_INLINE_ATTR size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls) { + /* Although some of these hashes do support hBits up to 64, some do not. + * To be on the safe side, always avoid hBits > 32. */ + assert(hBits <= 32); + switch(mls) { default: @@ -1264,6 +1269,42 @@ MEM_STATIC void ZSTD_debugTable(const U32* table, U32 max) #endif +/* Short Cache */ + +/* Normally, zstd matchfinders follow this flow: + * 1. Compute hash at ip + * 2. Load index from hashTable[hash] + * 3. Check if *ip == *(base + index) + * In dictionary compression, loading *(base + index) is often an L2 or even L3 miss. + * + * Short cache is an optimization which allows us to avoid step 3 most of the time + * when the data doesn't actually match. With short cache, the flow becomes: + * 1. Compute (hash, currentTag) at ip. currentTag is an 8-bit independent hash at ip. + * 2. Load (index, matchTag) from hashTable[hash]. See ZSTD_writeTaggedIndex to understand how this works. + * 3. Only if currentTag == matchTag, check *ip == *(base + index). Otherwise, continue. + * + * Currently, short cache is only implemented in CDict hashtables. Thus, its use is limited to + * dictMatchState matchfinders. + */ +#define ZSTD_SHORT_CACHE_TAG_BITS 8 +#define ZSTD_SHORT_CACHE_TAG_MASK ((1u << ZSTD_SHORT_CACHE_TAG_BITS) - 1) + +/* Helper function for ZSTD_fillHashTable and ZSTD_fillDoubleHashTable. + * Unpacks hashAndTag into (hash, tag), then packs (index, tag) into hashTable[hash]. */ +MEM_STATIC void ZSTD_writeTaggedIndex(U32* const hashTable, size_t hashAndTag, U32 index) { + size_t const hash = hashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS; + U32 const tag = (U32)(hashAndTag & ZSTD_SHORT_CACHE_TAG_MASK); + assert(index >> (32 - ZSTD_SHORT_CACHE_TAG_BITS) == 0); + hashTable[hash] = (index << ZSTD_SHORT_CACHE_TAG_BITS) | tag; +} + +/* Helper function for short cache matchfinders. + * Unpacks tag1 and tag2 from lower bits of packedTag1 and packedTag2, then checks if the tags match. */ +MEM_STATIC int ZSTD_comparePackedTags(size_t packedTag1, size_t packedTag2) { + U32 const tag1 = packedTag1 & ZSTD_SHORT_CACHE_TAG_MASK; + U32 const tag2 = packedTag2 & ZSTD_SHORT_CACHE_TAG_MASK; + return tag1 == tag2; +} #if defined (__cplusplus) } diff --git a/lib/compress/zstd_double_fast.c b/lib/compress/zstd_double_fast.c index d8412ef0b..6697ba0a9 100644 --- a/lib/compress/zstd_double_fast.c +++ b/lib/compress/zstd_double_fast.c @@ -11,8 +11,43 @@ #include "zstd_compress_internal.h" #include "zstd_double_fast.h" +static void ZSTD_fillDoubleHashTableForCDict(ZSTD_matchState_t* ms, + void const* end, ZSTD_dictTableLoadMethod_e dtlm) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashLarge = ms->hashTable; + U32 const hBitsL = cParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + U32 const mls = cParams->minMatch; + U32* const hashSmall = ms->chainTable; + U32 const hBitsS = cParams->chainLog + ZSTD_SHORT_CACHE_TAG_BITS; + const BYTE* const base = ms->window.base; + const BYTE* ip = base + ms->nextToUpdate; + const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; + const U32 fastHashFillStep = 3; -void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, + /* Always insert every fastHashFillStep position into the hash tables. + * Insert the other positions into the large hash table if their entry + * is empty. + */ + for (; ip + fastHashFillStep - 1 <= iend; ip += fastHashFillStep) { + U32 const curr = (U32)(ip - base); + U32 i; + for (i = 0; i < fastHashFillStep; ++i) { + size_t const smHashAndTag = ZSTD_hashPtr(ip + i, hBitsS, mls); + size_t const lgHashAndTag = ZSTD_hashPtr(ip + i, hBitsL, 8); + if (i == 0) { + ZSTD_writeTaggedIndex(hashSmall, smHashAndTag, curr + i); + } + if (i == 0 || hashLarge[lgHashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS] == 0) { + ZSTD_writeTaggedIndex(hashLarge, lgHashAndTag, curr + i); + } + /* Only load extra positions for ZSTD_dtlm_full */ + if (dtlm == ZSTD_dtlm_fast) + break; + } } +} + +static void ZSTD_fillDoubleHashTableForCCtx(ZSTD_matchState_t* ms, void const* end, ZSTD_dictTableLoadMethod_e dtlm) { const ZSTD_compressionParameters* const cParams = &ms->cParams; @@ -43,7 +78,19 @@ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, /* Only load extra positions for ZSTD_dtlm_full */ if (dtlm == ZSTD_dtlm_fast) break; - } } + } } +} + +void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp) +{ + if (tfp == ZSTD_tfp_forCDict) { + ZSTD_fillDoubleHashTableForCDict(ms, end, dtlm); + } else { + ZSTD_fillDoubleHashTableForCCtx(ms, end, dtlm); + } } @@ -289,8 +336,8 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( const BYTE* const dictStart = dictBase + dictStartIndex; const BYTE* const dictEnd = dms->window.nextSrc; const U32 dictIndexDelta = prefixLowestIndex - (U32)(dictEnd - dictBase); - const U32 dictHBitsL = dictCParams->hashLog; - const U32 dictHBitsS = dictCParams->chainLog; + const U32 dictHBitsL = dictCParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + const U32 dictHBitsS = dictCParams->chainLog + ZSTD_SHORT_CACHE_TAG_BITS; const U32 dictAndPrefixLength = (U32)((ip - prefixLowest) + (dictEnd - dictStart)); DEBUGLOG(5, "ZSTD_compressBlock_doubleFast_dictMatchState_generic"); @@ -312,8 +359,12 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( U32 offset; size_t const h2 = ZSTD_hashPtr(ip, hBitsL, 8); size_t const h = ZSTD_hashPtr(ip, hBitsS, mls); - size_t const dictHL = ZSTD_hashPtr(ip, dictHBitsL, 8); - size_t const dictHS = ZSTD_hashPtr(ip, dictHBitsS, mls); + size_t const dictHashAndTagL = ZSTD_hashPtr(ip, dictHBitsL, 8); + size_t const dictHashAndTagS = ZSTD_hashPtr(ip, dictHBitsS, mls); + U32 const dictMatchIndexAndTagL = dictHashLong[dictHashAndTagL >> ZSTD_SHORT_CACHE_TAG_BITS]; + U32 const dictMatchIndexAndTagS = dictHashSmall[dictHashAndTagS >> ZSTD_SHORT_CACHE_TAG_BITS]; + int const dictTagsMatchL = ZSTD_comparePackedTags(dictMatchIndexAndTagL, dictHashAndTagL); + int const dictTagsMatchS = ZSTD_comparePackedTags(dictMatchIndexAndTagS, dictHashAndTagS); U32 const curr = (U32)(ip-base); U32 const matchIndexL = hashLong[h2]; U32 matchIndexS = hashSmall[h]; @@ -343,9 +394,9 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( while (((ip>anchor) & (matchLong>prefixLowest)) && (ip[-1] == matchLong[-1])) { ip--; matchLong--; mLength++; } /* catch up */ goto _match_found; } - } else { + } else if (dictTagsMatchL) { /* check dictMatchState long match */ - U32 const dictMatchIndexL = dictHashLong[dictHL]; + U32 const dictMatchIndexL = dictMatchIndexAndTagL >> ZSTD_SHORT_CACHE_TAG_BITS; const BYTE* dictMatchL = dictBase + dictMatchIndexL; assert(dictMatchL < dictEnd); @@ -361,9 +412,9 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( if (MEM_read32(match) == MEM_read32(ip)) { goto _search_next_long; } - } else { + } else if (dictTagsMatchS) { /* check dictMatchState short match */ - U32 const dictMatchIndexS = dictHashSmall[dictHS]; + U32 const dictMatchIndexS = dictMatchIndexAndTagS >> ZSTD_SHORT_CACHE_TAG_BITS; match = dictBase + dictMatchIndexS; matchIndexS = dictMatchIndexS + dictIndexDelta; @@ -378,10 +429,11 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( continue; _search_next_long: - { size_t const hl3 = ZSTD_hashPtr(ip+1, hBitsL, 8); - size_t const dictHLNext = ZSTD_hashPtr(ip+1, dictHBitsL, 8); + size_t const dictHashAndTagL3 = ZSTD_hashPtr(ip+1, dictHBitsL, 8); U32 const matchIndexL3 = hashLong[hl3]; + U32 const dictMatchIndexAndTagL3 = dictHashLong[dictHashAndTagL3 >> ZSTD_SHORT_CACHE_TAG_BITS]; + int const dictTagsMatchL3 = ZSTD_comparePackedTags(dictMatchIndexAndTagL3, dictHashAndTagL3); const BYTE* matchL3 = base + matchIndexL3; hashLong[hl3] = curr + 1; @@ -394,9 +446,9 @@ _search_next_long: while (((ip>anchor) & (matchL3>prefixLowest)) && (ip[-1] == matchL3[-1])) { ip--; matchL3--; mLength++; } /* catch up */ goto _match_found; } - } else { + } else if (dictTagsMatchL3) { /* check dict long +1 match */ - U32 const dictMatchIndexL3 = dictHashLong[dictHLNext]; + U32 const dictMatchIndexL3 = dictMatchIndexAndTagL3 >> ZSTD_SHORT_CACHE_TAG_BITS; const BYTE* dictMatchL3 = dictBase + dictMatchIndexL3; assert(dictMatchL3 < dictEnd); if (dictMatchL3 > dictStart && MEM_read64(dictMatchL3) == MEM_read64(ip+1)) { diff --git a/lib/compress/zstd_double_fast.h b/lib/compress/zstd_double_fast.h index e16b7b03a..6d8ee8c65 100644 --- a/lib/compress/zstd_double_fast.h +++ b/lib/compress/zstd_double_fast.h @@ -19,7 +19,8 @@ extern "C" { #include "zstd_compress_internal.h" /* ZSTD_CCtx, size_t */ void ZSTD_fillDoubleHashTable(ZSTD_matchState_t* ms, - void const* end, ZSTD_dictTableLoadMethod_e dtlm); + void const* end, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp); size_t ZSTD_compressBlock_doubleFast( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize); diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index b0ec972c6..de7336907 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -11,8 +11,42 @@ #include "zstd_compress_internal.h" /* ZSTD_hashPtr, ZSTD_count, ZSTD_storeSeq */ #include "zstd_fast.h" +static void ZSTD_fillHashTableForCDict(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm) +{ + const ZSTD_compressionParameters* const cParams = &ms->cParams; + U32* const hashTable = ms->hashTable; + U32 const hBits = cParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; + U32 const mls = cParams->minMatch; + const BYTE* const base = ms->window.base; + const BYTE* ip = base + ms->nextToUpdate; + const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; + const U32 fastHashFillStep = 3; -void ZSTD_fillHashTable(ZSTD_matchState_t* ms, + /* Currently, we always use ZSTD_dtlm_full for filling CDict tables. + * Feel free to remove this assert if there's a good reason! */ + assert(dtlm == ZSTD_dtlm_full); + + /* Always insert every fastHashFillStep position into the hash table. + * Insert the other positions if their hash entry is empty. + */ + for ( ; ip + fastHashFillStep < iend + 2; ip += fastHashFillStep) { + U32 const curr = (U32)(ip - base); + { size_t const hashAndTag = ZSTD_hashPtr(ip, hBits, mls); + ZSTD_writeTaggedIndex(hashTable, hashAndTag, curr); } + + if (dtlm == ZSTD_dtlm_fast) continue; + /* Only load extra positions for ZSTD_dtlm_full */ + { U32 p; + for (p = 1; p < fastHashFillStep; ++p) { + size_t const hashAndTag = ZSTD_hashPtr(ip + p, hBits, mls); + if (hashTable[hashAndTag >> ZSTD_SHORT_CACHE_TAG_BITS] == 0) { /* not yet filled */ + ZSTD_writeTaggedIndex(hashTable, hashAndTag, curr + p); + } } } } +} + +static void ZSTD_fillHashTableForCCtx(ZSTD_matchState_t* ms, const void* const end, ZSTD_dictTableLoadMethod_e dtlm) { @@ -25,6 +59,10 @@ void ZSTD_fillHashTable(ZSTD_matchState_t* ms, const BYTE* const iend = ((const BYTE*)end) - HASH_READ_SIZE; const U32 fastHashFillStep = 3; + /* Currently, we always use ZSTD_dtlm_fast for filling CCtx tables. + * Feel free to remove this assert if there's a good reason! */ + assert(dtlm == ZSTD_dtlm_fast); + /* Always insert every fastHashFillStep position into the hash table. * Insert the other positions if their hash entry is empty. */ @@ -42,6 +80,18 @@ void ZSTD_fillHashTable(ZSTD_matchState_t* ms, } } } } } +void ZSTD_fillHashTable(ZSTD_matchState_t* ms, + const void* const end, + ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp) +{ + if (tfp == ZSTD_tfp_forCDict) { + ZSTD_fillHashTableForCDict(ms, end, dtlm); + } else { + ZSTD_fillHashTableForCCtx(ms, end, dtlm); + } +} + /** * If you squint hard enough (and ignore repcodes), the search operation at any @@ -435,7 +485,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( const BYTE* const dictEnd = dms->window.nextSrc; const U32 dictIndexDelta = prefixStartIndex - (U32)(dictEnd - dictBase); const U32 dictAndPrefixLength = (U32)(istart - prefixStart + dictEnd - dictStart); - const U32 dictHLog = dictCParams->hashLog; + const U32 dictHBits = dictCParams->hashLog + ZSTD_SHORT_CACHE_TAG_BITS; /* if a dictionary is still attached, it necessarily means that * it is within window size. So we just check it. */ @@ -463,8 +513,11 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( while (ip1 <= ilimit) { /* repcode check at (ip0 + 1) is safe because ip0 < ip1 */ size_t mLength; size_t hash0 = ZSTD_hashPtr(ip0, hlog, mls); - const size_t dictHash0 = ZSTD_hashPtr(ip0, dictHLog, mls); - U32 dictMatchIndex = dictHashTable[dictHash0]; + + size_t const dictHashAndTag0 = ZSTD_hashPtr(ip0, dictHBits, mls); + U32 dictMatchIndexAndTag = dictHashTable[dictHashAndTag0 >> ZSTD_SHORT_CACHE_TAG_BITS]; + int dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag0); + U32 matchIndex = hashTable[hash0]; U32 curr = (U32)(ip0 - base); size_t step = stepSize; @@ -479,7 +532,7 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( dictBase + (repIndex - dictIndexDelta) : base + repIndex; const size_t hash1 = ZSTD_hashPtr(ip1, hlog, mls); - const size_t dictHash1 = ZSTD_hashPtr(ip1, dictHLog, mls); + size_t const dictHashAndTag1 = ZSTD_hashPtr(ip1, dictHBits, mls); hashTable[hash0] = curr; /* update hash table */ if (((U32) ((prefixStartIndex - 1) - repIndex) >= @@ -490,26 +543,33 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( ip0++; ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, REPCODE1_TO_OFFBASE, mLength); break; - } else if (matchIndex <= prefixStartIndex) { - /* We only look for a dict match if the normal matchIndex is invalid */ + } + + if (dictTagsMatch) { + /* Found a possible dict match */ + const U32 dictMatchIndex = dictMatchIndexAndTag >> ZSTD_SHORT_CACHE_TAG_BITS; const BYTE* dictMatch = dictBase + dictMatchIndex; if (dictMatchIndex > dictStartIndex && MEM_read32(dictMatch) == MEM_read32(ip0)) { - /* found a dict match */ - U32 const offset = (U32) (curr - dictMatchIndex - dictIndexDelta); - mLength = ZSTD_count_2segments(ip0 + 4, dictMatch + 4, iend, dictEnd, prefixStart) + 4; - while (((ip0 > anchor) & (dictMatch > dictStart)) - && (ip0[-1] == dictMatch[-1])) { - ip0--; - dictMatch--; - mLength++; - } /* catch up */ - offset_2 = offset_1; - offset_1 = offset; - ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); - break; + /* To replicate extDict parse behavior, we only use dict matches when the normal matchIndex is invalid */ + if (matchIndex <= prefixStartIndex) { + U32 const offset = (U32) (curr - dictMatchIndex - dictIndexDelta); + mLength = ZSTD_count_2segments(ip0 + 4, dictMatch + 4, iend, dictEnd, prefixStart) + 4; + while (((ip0 > anchor) & (dictMatch > dictStart)) + && (ip0[-1] == dictMatch[-1])) { + ip0--; + dictMatch--; + mLength++; + } /* catch up */ + offset_2 = offset_1; + offset_1 = offset; + ZSTD_storeSeq(seqStore, (size_t) (ip0 - anchor), anchor, iend, OFFSET_TO_OFFBASE(offset), mLength); + break; + } } - } else if (MEM_read32(match) == MEM_read32(ip0)) { + } + + if (matchIndex > prefixStartIndex && MEM_read32(match) == MEM_read32(ip0)) { /* found a regular match */ U32 const offset = (U32) (ip0 - match); mLength = ZSTD_count(ip0 + 4, match + 4, iend) + 4; @@ -526,7 +586,8 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( } /* Prepare for next iteration */ - dictMatchIndex = dictHashTable[dictHash1]; + dictMatchIndexAndTag = dictHashTable[dictHashAndTag1 >> ZSTD_SHORT_CACHE_TAG_BITS]; + dictTagsMatch = ZSTD_comparePackedTags(dictMatchIndexAndTag, dictHashAndTag1); matchIndex = hashTable[hash1]; if (ip1 >= nextStep) { diff --git a/lib/compress/zstd_fast.h b/lib/compress/zstd_fast.h index 0d4a0c109..3bfeb2c5f 100644 --- a/lib/compress/zstd_fast.h +++ b/lib/compress/zstd_fast.h @@ -19,7 +19,8 @@ extern "C" { #include "zstd_compress_internal.h" void ZSTD_fillHashTable(ZSTD_matchState_t* ms, - void const* end, ZSTD_dictTableLoadMethod_e dtlm); + void const* end, ZSTD_dictTableLoadMethod_e dtlm, + ZSTD_tableFillPurpose_e tfp); size_t ZSTD_compressBlock_fast( ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], void const* src, size_t srcSize); diff --git a/lib/compress/zstd_ldm.c b/lib/compress/zstd_ldm.c index e1d2f7410..c14c62454 100644 --- a/lib/compress/zstd_ldm.c +++ b/lib/compress/zstd_ldm.c @@ -242,11 +242,11 @@ static size_t ZSTD_ldm_fillFastTables(ZSTD_matchState_t* ms, switch(ms->cParams.strategy) { case ZSTD_fast: - ZSTD_fillHashTable(ms, iend, ZSTD_dtlm_fast); + ZSTD_fillHashTable(ms, iend, ZSTD_dtlm_fast, ZSTD_tfp_forCCtx); break; case ZSTD_dfast: - ZSTD_fillDoubleHashTable(ms, iend, ZSTD_dtlm_fast); + ZSTD_fillDoubleHashTable(ms, iend, ZSTD_dtlm_fast, ZSTD_tfp_forCCtx); break; case ZSTD_greedy: From 91aeade7352a31b96944ee68112e748d0c42635c Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 21 Jun 2022 18:14:11 -0700 Subject: [PATCH 163/472] Streaming decompression can detect incorrect header ID sooner Streaming decompression used to wait for a minimum of 5 bytes before attempting decoding. This meant that, in the case that only a few bytes (<5) were provided, and assuming these bytes are incorrect, there would be no error reported. The streaming API would simply request more data, waiting for at least 5 bytes. This PR makes it possible to detect incorrect Frame IDs as soon as the first byte is provided. Fix #3169 --- lib/decompress/zstd_decompress.c | 48 +++++++++++++++++++++++++------- tests/zstreamtest.c | 9 ++++++ 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index 85f4d2202..5bd412df4 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -79,11 +79,11 @@ *************************************/ #define DDICT_HASHSET_MAX_LOAD_FACTOR_COUNT_MULT 4 -#define DDICT_HASHSET_MAX_LOAD_FACTOR_SIZE_MULT 3 /* These two constants represent SIZE_MULT/COUNT_MULT load factor without using a float. - * Currently, that means a 0.75 load factor. - * So, if count * COUNT_MULT / size * SIZE_MULT != 0, then we've exceeded - * the load factor of the ddict hash set. - */ +#define DDICT_HASHSET_MAX_LOAD_FACTOR_SIZE_MULT 3 /* These two constants represent SIZE_MULT/COUNT_MULT load factor without using a float. + * Currently, that means a 0.75 load factor. + * So, if count * COUNT_MULT / size * SIZE_MULT != 0, then we've exceeded + * the load factor of the ddict hash set. + */ #define DDICT_HASHSET_TABLE_BASE_SIZE 64 #define DDICT_HASHSET_RESIZE_FACTOR 2 @@ -439,16 +439,40 @@ size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize) * note : only works for formats ZSTD_f_zstd1 and ZSTD_f_zstd1_magicless * @return : 0, `zfhPtr` is correctly filled, * >0, `srcSize` is too small, value is wanted `srcSize` amount, - * or an error code, which can be tested using ZSTD_isError() */ +** or an error code, which can be tested using ZSTD_isError() */ size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format) { const BYTE* ip = (const BYTE*)src; size_t const minInputSize = ZSTD_startingInputLength(format); - ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr)); /* not strictly necessary, but static analyzer do not understand that zfhPtr is only going to be read only if return value is zero, since they are 2 different signals */ - if (srcSize < minInputSize) return minInputSize; - RETURN_ERROR_IF(src==NULL, GENERIC, "invalid parameter"); + DEBUGLOG(5, "ZSTD_getFrameHeader_advanced: minInputSize = %zu, srcSize = %zu", minInputSize, srcSize); + if (srcSize > 0) { + /* note : technically could be considered an assert(), since it's an invalid entry */ + RETURN_ERROR_IF(src==NULL, GENERIC, "invalid parameter : src==NULL, but srcSize>0"); + } + if (srcSize < minInputSize) { + if (srcSize > 0 && format != ZSTD_f_zstd1_magicless) { + /* when receiving less than @minInputSize bytes, + * control these bytes at least correspond to a supported magic number + * in order to error out early if they don't. + **/ + size_t const toCopy = MIN(4, srcSize); + unsigned char hbuf[4]; MEM_writeLE32(hbuf, ZSTD_MAGICNUMBER); + assert(src != NULL); + ZSTD_memcpy(hbuf, src, toCopy); + if ( MEM_readLE32(hbuf) != ZSTD_MAGICNUMBER ) { + /* not a zstd frame : let's check if it's a skippable frame */ + MEM_writeLE32(hbuf, ZSTD_MAGIC_SKIPPABLE_START); + ZSTD_memcpy(hbuf, src, toCopy); + if ((MEM_readLE32(hbuf) & ZSTD_MAGIC_SKIPPABLE_MASK) != ZSTD_MAGIC_SKIPPABLE_START) { + RETURN_ERROR(prefix_unknown, + "first bytes don't correspond to any supported magic number"); + } } } + return minInputSize; + } + + ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr)); /* not strictly necessary, but static analyzers may not understand that zfhPtr will be read only if return value is zero, since they are 2 different signals */ if ( (format != ZSTD_f_zstd1_magicless) && (MEM_readLE32(src) != ZSTD_MAGICNUMBER) ) { if ((MEM_readLE32(src) & ZSTD_MAGIC_SKIPPABLE_MASK) == ZSTD_MAGIC_SKIPPABLE_START) { @@ -1981,7 +2005,6 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB if (zds->refMultipleDDicts && zds->ddictSet) { ZSTD_DCtx_selectFrameDDict(zds); } - DEBUGLOG(5, "header size : %u", (U32)hSize); if (ZSTD_isError(hSize)) { #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1) U32 const legacyVersion = ZSTD_isLegacy(istart, iend-istart); @@ -2013,6 +2036,11 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB zds->lhSize += remainingInput; } input->pos = input->size; + /* check first few bytes */ + FORWARD_IF_ERROR( + ZSTD_getFrameHeader_advanced(&zds->fParams, zds->headerBuffer, zds->lhSize, zds->format), + "First few bytes detected incorrect" ); + /* return hint input size */ return (MAX((size_t)ZSTD_FRAMEHEADERSIZE_MIN(zds->format), hSize) - zds->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */ } assert(ip != NULL); diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index 20a05a75c..3fcdd5399 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -424,6 +424,15 @@ static int basicUnitTests(U32 seed, double compressibility) } } DISPLAYLEVEL(3, "OK \n"); + /* check decompression fails early if first bytes are wrong */ + DISPLAYLEVEL(3, "test%3i : early decompression error if first bytes are incorrect : ", testNb++); + { const char buf[3] = { 0 }; /* too short, not enough to start decoding header */ + ZSTD_inBuffer inb = { buf, sizeof(buf), 0 }; + size_t const remaining = ZSTD_decompressStream(zd, &outBuff, &inb); + if (!ZSTD_isError(remaining)) goto _output_error; /* should have errored out immediately (note: this does not test the exact error code) */ + } + DISPLAYLEVEL(3, "OK \n"); + /* context size functions */ DISPLAYLEVEL(3, "test%3i : estimate DStream size : ", testNb++); { ZSTD_frameHeader fhi; From 2a128110d05aa5f67c9faee55a4fc538c169c16b Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 21 Jun 2022 11:59:27 -0400 Subject: [PATCH 164/472] Add prefetchCDictTables CCtxParam --- lib/compress/zstd_compress.c | 16 ++++++++++++++++ lib/compress/zstd_compress_internal.h | 4 ++++ lib/compress/zstd_double_fast.c | 7 +++++++ lib/compress/zstd_fast.c | 5 +++++ lib/zstd.h | 7 ++++++- 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 46a9dbe66..f8ca7d35e 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -576,6 +576,11 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) bounds.upperBound = 1; return bounds; + case ZSTD_c_prefetchCDictTables: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + default: bounds.error = ERROR(parameter_unsupported); return bounds; @@ -640,6 +645,7 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param) case ZSTD_c_useBlockSplitter: case ZSTD_c_useRowMatchFinder: case ZSTD_c_deterministicRefPrefix: + case ZSTD_c_prefetchCDictTables: default: return 0; } @@ -695,6 +701,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value) case ZSTD_c_useBlockSplitter: case ZSTD_c_useRowMatchFinder: case ZSTD_c_deterministicRefPrefix: + case ZSTD_c_prefetchCDictTables: break; default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); @@ -921,6 +928,11 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, CCtxParams->deterministicRefPrefix = !!value; return CCtxParams->deterministicRefPrefix; + case ZSTD_c_prefetchCDictTables: + BOUNDCHECK(ZSTD_c_prefetchCDictTables, value); + CCtxParams->prefetchCDictTables = (ZSTD_paramSwitch_e)value; + return CCtxParams->prefetchCDictTables; + default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); } } @@ -1053,6 +1065,9 @@ size_t ZSTD_CCtxParams_getParameter( case ZSTD_c_deterministicRefPrefix: *value = (int)CCtxParams->deterministicRefPrefix; break; + case ZSTD_c_prefetchCDictTables: + *value = (int)CCtxParams->prefetchCDictTables; + break; default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); } return 0; @@ -2913,6 +2928,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) zc->appliedParams.useRowMatchFinder, dictMode); ms->ldmSeqStore = NULL; + ms->prefetchCDictTables = zc->appliedParams.prefetchCDictTables == ZSTD_ps_enable; lastLLSize = blockCompressor(ms, &zc->seqStore, zc->blockState.nextCBlock->rep, src, srcSize); } { const BYTE* const lastLiterals = (const BYTE*)src + srcSize - lastLLSize; diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 870bcc8be..bd1077f86 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -235,6 +235,7 @@ struct ZSTD_matchState_t { const ZSTD_matchState_t* dictMatchState; ZSTD_compressionParameters cParams; const rawSeqStore_t* ldmSeqStore; + int prefetchCDictTables; /* TODO document */ }; typedef struct { @@ -331,6 +332,9 @@ struct ZSTD_CCtx_params_s { /* Internal use, for createCCtxParams() and freeCCtxParams() only */ ZSTD_customMem customMem; + + /* TODO document */ + ZSTD_paramSwitch_e prefetchCDictTables; }; /* typedef'd to ZSTD_CCtx_params within "zstd.h" */ #define COMPRESS_SEQUENCES_WORKSPACE_SIZE (sizeof(unsigned) * (MaxSeq + 2)) diff --git a/lib/compress/zstd_double_fast.c b/lib/compress/zstd_double_fast.c index 6697ba0a9..a69fdc818 100644 --- a/lib/compress/zstd_double_fast.c +++ b/lib/compress/zstd_double_fast.c @@ -345,6 +345,13 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( /* if a dictionary is attached, it must be within window range */ assert(ms->window.dictLimit + (1U << cParams->windowLog) >= endIndex); + if (ms->prefetchCDictTables) { + size_t const hashTableSize = ((size_t)1) << dictCParams->hashLog; + size_t const chainTableSize = ((size_t)1) << dictCParams->chainLog; + PREFETCH_AREA(dictHashLong, hashTableSize * sizeof(U32)) + PREFETCH_AREA(dictHashSmall, chainTableSize * sizeof(U32)) + } + /* init */ ip += (dictAndPrefixLength == 0); diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index de7336907..a44057988 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -500,6 +500,11 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( * when translating a dict index into a local index */ assert(prefixStartIndex >= (U32)(dictEnd - dictBase)); + if (ms->prefetchCDictTables) { + size_t const hashTableSize = ((size_t)1) << dictCParams->hashLog; + PREFETCH_AREA(dictHashTable, hashTableSize * sizeof(U32)) + } + /* init */ DEBUGLOG(5, "ZSTD_compressBlock_fast_dictMatchState_generic"); ip0 += (dictAndPrefixLength == 0); diff --git a/lib/zstd.h b/lib/zstd.h index 14a78cd93..221426715 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -421,6 +421,7 @@ typedef enum { * ZSTD_c_validateSequences * ZSTD_c_useBlockSplitter * ZSTD_c_useRowMatchFinder + * ZSTD_c_prefetchCDictTables * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. * note : never ever use experimentalParam? names directly; * also, the enums values themselves are unstable and can still change. @@ -439,7 +440,8 @@ typedef enum { ZSTD_c_experimentalParam12=1009, ZSTD_c_experimentalParam13=1010, ZSTD_c_experimentalParam14=1011, - ZSTD_c_experimentalParam15=1012 + ZSTD_c_experimentalParam15=1012, + ZSTD_c_experimentalParam16=1013 } ZSTD_cParameter; typedef struct { @@ -1954,6 +1956,9 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo */ #define ZSTD_c_deterministicRefPrefix ZSTD_c_experimentalParam15 +/* TODO document */ +#define ZSTD_c_prefetchCDictTables ZSTD_c_experimentalParam16 + /*! ZSTD_CCtx_getParameter() : * Get the requested compression parameter value, selected by enum ZSTD_cParameter, * and store it into int* value. From 93b89fb24b1e019ffc2df027993d04e4c0cadfef Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 21 Jun 2022 18:06:48 -0400 Subject: [PATCH 165/472] Add docs --- lib/compress/zstd_compress_internal.h | 4 ++-- lib/zstd.h | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index bd1077f86..8c73007c8 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -235,7 +235,7 @@ struct ZSTD_matchState_t { const ZSTD_matchState_t* dictMatchState; ZSTD_compressionParameters cParams; const rawSeqStore_t* ldmSeqStore; - int prefetchCDictTables; /* TODO document */ + int prefetchCDictTables; /* Controls prefetching in some dictMatchState matchfinders */ }; typedef struct { @@ -333,7 +333,7 @@ struct ZSTD_CCtx_params_s { /* Internal use, for createCCtxParams() and freeCCtxParams() only */ ZSTD_customMem customMem; - /* TODO document */ + /* Controls prefetching in some dictMatchState matchfinders */ ZSTD_paramSwitch_e prefetchCDictTables; }; /* typedef'd to ZSTD_CCtx_params within "zstd.h" */ diff --git a/lib/zstd.h b/lib/zstd.h index 221426715..14b4b4559 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -1956,7 +1956,27 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo */ #define ZSTD_c_deterministicRefPrefix ZSTD_c_experimentalParam15 -/* TODO document */ +/* ZSTD_c_prefetchCDictTables + * Controlled with ZSTD_paramSwitch_e enum. Default is ZSTD_ps_auto. + * + * In some situations, zstd uses CDict tables in-place rather than copying them + * into the working context. (See docs on ZSTD_dictAttachPref_e above for details). + * In such situations, compression speed is seriously impacted when CDict tables are + * "cold" (outside CPU cache). This parameter instructs zstd to prefetch CDict tables + * when they are used in-place. + * + * For sufficiently small inputs, the cost of the prefetch will outweigh the benefit. + * For sufficiently large inputs, zstd will by default memcpy() CDict tables + * into the working context, so there is no need to prefetch. This parameter is + * targeted at a middle range of input sizes, where a prefetch is cheap enough to be + * useful but memcpy() is too expensive. The exact range of input sizes where this + * makes sense is best determined by careful experimentation. + * + * Note: for this parameter, ZSTD_ps_auto is currently equivalent to ZSTD_ps_disable, + * but in the future zstd may conditionally enable this feature via an auto-detection + * heuristic for cold CDicts. + * Use ZSTD_ps_disable to opt out of prefetching under any circumstances. + */ #define ZSTD_c_prefetchCDictTables ZSTD_c_experimentalParam16 /*! ZSTD_CCtx_getParameter() : From 6bd5ac671352801cd249576d94606bdc0ef235ec Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 22 Jun 2022 08:59:28 -0700 Subject: [PATCH 166/472] add prefetchCDictTables to largeNbDicts --- contrib/largeNbDicts/largeNbDicts.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index 25b154c30..66850e28c 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -968,6 +968,7 @@ int main (int argc, const char** argv) unsigned nbBlocks = 0; /* determine nbBlocks automatically, from source and blockSize */ ZSTD_dictContentType_e dictContentType = ZSTD_dct_auto; ZSTD_dictAttachPref_e dictAttachPref = ZSTD_dictDefaultAttach; + ZSTD_paramSwitch_e prefetchCDictTables = ZSTD_ps_auto; for (int argNb = 1; argNb < argc ; argNb++) { const char* argument = argv[argNb]; @@ -986,6 +987,7 @@ int main (int argc, const char** argv) if (longCommandWArg(&argument, "--dedicated-dict-search")) { dedicatedDictSearch = 1; continue; } if (longCommandWArg(&argument, "--dict-content-type=")) { dictContentType = (int)readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "--dict-attach-pref=")) { dictAttachPref = (int)readU32FromChar(&argument); continue; } + if (longCommandWArg(&argument, "--prefetch-cdict-tables=")) { prefetchCDictTables = (int)readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "-")) { cLevel = (int)readU32FromChar(&argument); continue; } /* anything that's not a command is a filename */ nameTable[nameIdx++] = argument; @@ -1008,6 +1010,7 @@ int main (int argc, const char** argv) ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_enableDedicatedDictSearch, dedicatedDictSearch); ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_nbWorkers, 0); ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_forceAttachDict, dictAttachPref); + ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_prefetchCDictTables, prefetchCDictTables); int result = bench(filenameTable->fileNames, (unsigned)filenameTable->tableSize, dictionary, blockSize, cLevel, nbDicts, nbBlocks, nbRounds, benchCompression, dictContentType, cctxParams, exeName); From 747e06f4f6db99d7f4a05f6a0d4a5490da7c944f Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 22 Jun 2022 17:05:23 -0400 Subject: [PATCH 167/472] Add tests --- tests/fuzz/zstd_helpers.c | 1 + tests/fuzzer.c | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/fuzz/zstd_helpers.c b/tests/fuzz/zstd_helpers.c index f66579754..4f8727df9 100644 --- a/tests/fuzz/zstd_helpers.c +++ b/tests/fuzz/zstd_helpers.c @@ -98,6 +98,7 @@ void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer setRand(cctx, ZSTD_c_forceAttachDict, 0, 2, producer); setRand(cctx, ZSTD_c_useBlockSplitter, 0, 2, producer); setRand(cctx, ZSTD_c_deterministicRefPrefix, 0, 1, producer); + setRand(cctx, ZSTD_c_prefetchCDictTables, 0, 2, producer); if (FUZZ_dataProducer_uint32Range(producer, 0, 1) == 0) { setRand(cctx, ZSTD_c_srcSizeHint, ZSTD_SRCSIZEHINT_MIN, 2 * srcSize, producer); } diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 71356d53d..81c2d9dba 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -2041,6 +2041,7 @@ static int basicUnitTests(U32 const seed, double compressibility) CHECK_Z( ZSTD_CCtx_setParameter(ctxOrig, ZSTD_c_compressionLevel, l) ); CHECK_Z( ZSTD_CCtx_setParameter(ctxOrig, ZSTD_c_enableDedicatedDictSearch, 0) ); CHECK_Z( ZSTD_CCtx_setParameter(ctxOrig, ZSTD_c_forceAttachDict, ZSTD_dictForceAttach) ); + CHECK_Z( ZSTD_CCtx_setParameter(ctxOrig, ZSTD_c_prefetchCDictTables, seed % 3) ); wdict_cSize = ZSTD_compress2(ctxOrig, compressedBuffer, compressedBufferSize, contentStart, contentSize); if (wdict_cSize > target_wdict_cSize[l]) { DISPLAYLEVEL(1, "error : compression with dictionary and compress2 at level %i worse than expected (%u > %u) \n", From bb4a3c71ef352d2fdb5bb5bfa9b11b72bb3d28d5 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 22 Jun 2022 18:02:07 -0700 Subject: [PATCH 168/472] Update README.md for fuzzers (#3174) * Update README.md for fuzzers * Add ls corpora/*crash command * nit * Clarify wording and add Nick's command * Minor clarification --- tests/fuzz/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/fuzz/README.md b/tests/fuzz/README.md index 71afa4063..4ff7fe3ac 100644 --- a/tests/fuzz/README.md +++ b/tests/fuzz/README.md @@ -50,6 +50,20 @@ See the help of the relevant command for options. Flags not parsed by `fuzz.py` are passed to the fuzzing engine. The command used to run the fuzzer is printed for debugging. +Here's a helpful command to fuzz each target across all cores, +stopping only if a bug is found: +``` +for target in $(./fuzz.py list); do + ./fuzz.py libfuzzer $target -jobs=10 -workers=10 -max_total_time=1000 || break; +done +``` +Alternatively, you can fuzz all targets in parallel, using one core per target: +``` +python3 ./fuzz.py list | xargs -P$(python3 ./fuzz.py list | wc -l) -I__ sh -c "python3 ./fuzz.py libfuzzer __ 2>&1 | tee __.log" +``` +Either way, to double-check that no crashes were found, run `ls corpora/*crash`. +If any crashes were found, you can use the hashes to reproduce them. + ## LibFuzzer ``` From cb9e3411292133c4e2b96ef331760eefdf895f23 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 23 Jun 2022 16:58:03 -0400 Subject: [PATCH 169/472] Nits --- lib/compress/zstd_compress.c | 2 +- lib/compress/zstd_compress_internal.h | 6 +++++- lib/compress/zstd_double_fast.c | 8 ++++---- lib/compress/zstd_fast.c | 4 ++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index f8ca7d35e..b1f9bba8a 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -1943,6 +1943,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, /* init params */ zc->blockState.matchState.cParams = params->cParams; + zc->blockState.matchState.prefetchCDictTables = params->prefetchCDictTables == ZSTD_ps_enable; zc->pledgedSrcSizePlusOne = pledgedSrcSize+1; zc->consumedSrcSize = 0; zc->producedCSize = 0; @@ -2928,7 +2929,6 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) zc->appliedParams.useRowMatchFinder, dictMode); ms->ldmSeqStore = NULL; - ms->prefetchCDictTables = zc->appliedParams.prefetchCDictTables == ZSTD_ps_enable; lastLLSize = blockCompressor(ms, &zc->seqStore, zc->blockState.nextCBlock->rep, src, srcSize); } { const BYTE* const lastLiterals = (const BYTE*)src + srcSize - lastLLSize; diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 8c73007c8..4771b15ba 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -235,7 +235,11 @@ struct ZSTD_matchState_t { const ZSTD_matchState_t* dictMatchState; ZSTD_compressionParameters cParams; const rawSeqStore_t* ldmSeqStore; - int prefetchCDictTables; /* Controls prefetching in some dictMatchState matchfinders */ + + /* Controls prefetching in some dictMatchState matchfinders. + * This behavior is controlled from the cctx ms. + * This parameter has no effect in the cdict ms. */ + int prefetchCDictTables; }; typedef struct { diff --git a/lib/compress/zstd_double_fast.c b/lib/compress/zstd_double_fast.c index a69fdc818..c2dbd54c1 100644 --- a/lib/compress/zstd_double_fast.c +++ b/lib/compress/zstd_double_fast.c @@ -346,10 +346,10 @@ size_t ZSTD_compressBlock_doubleFast_dictMatchState_generic( assert(ms->window.dictLimit + (1U << cParams->windowLog) >= endIndex); if (ms->prefetchCDictTables) { - size_t const hashTableSize = ((size_t)1) << dictCParams->hashLog; - size_t const chainTableSize = ((size_t)1) << dictCParams->chainLog; - PREFETCH_AREA(dictHashLong, hashTableSize * sizeof(U32)) - PREFETCH_AREA(dictHashSmall, chainTableSize * sizeof(U32)) + size_t const hashTableBytes = (((size_t)1) << dictCParams->hashLog) * sizeof(U32); + size_t const chainTableBytes = (((size_t)1) << dictCParams->chainLog) * sizeof(U32); + PREFETCH_AREA(dictHashLong, hashTableBytes) + PREFETCH_AREA(dictHashSmall, chainTableBytes) } /* init */ diff --git a/lib/compress/zstd_fast.c b/lib/compress/zstd_fast.c index a44057988..291173449 100644 --- a/lib/compress/zstd_fast.c +++ b/lib/compress/zstd_fast.c @@ -501,8 +501,8 @@ size_t ZSTD_compressBlock_fast_dictMatchState_generic( assert(prefixStartIndex >= (U32)(dictEnd - dictBase)); if (ms->prefetchCDictTables) { - size_t const hashTableSize = ((size_t)1) << dictCParams->hashLog; - PREFETCH_AREA(dictHashTable, hashTableSize * sizeof(U32)) + size_t const hashTableBytes = (((size_t)1) << dictCParams->hashLog) * sizeof(U32); + PREFETCH_AREA(dictHashTable, hashTableBytes) } /* init */ From 5c382bf1104109de88dbde534ab7ba384773c1df Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 29 Jun 2022 13:11:13 -0400 Subject: [PATCH 170/472] 1.5.3 version bump --- CHANGELOG | 35 +++++++++++++++++++++++++++++++++++ doc/zstd_manual.html | 29 ++++++++++++++++------------- lib/zstd.h | 2 +- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 4e0045b95..e8c40f302 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,38 @@ +v1.5.3 (June, 2022) +perf: 5-30% faster dictionary compression at levels 1-4 (#3086, #3114, #3152, @embg) +perf: 5-10% faster streaming compression at levels 1-2 (#3114, @embg) +perf: Remove branch in ZSTD_fast_noDict (#3129, @felixhandte) +perf: Add option to prefetch CDict tables (#3177, @embg) +perf: Minor compression ratio improvement (#2983, @Cyan4973) +perf: Minor speed improvement for Huffman decoding (#3013, @WojciechMula) +perf: Enable STATIC_BMI2 for gcc/clang (#3080, @TocarIP) +perf: Optimize ZSTD_row_getMatchMask for ARM levels 8-10 (#3139, #3160, @danlark1) +perf: aarch64 performance improvements (#3145, #3141, @JunHe77) +perf: Lazy parameters adaptation (#2974, @Cyan4973) +cli: Async write for decompression (#2975, @yoniko) +cli: Use buffered output (#2985, @yoniko) +cli: Change zstdless behavior to align with zless (#2909, @binhdvo) +cli: AsyncIO compression (#3021, #3022, @yoniko) +cli: Print zlib/lz4/lzma library versions in verbose version output (#3030, @terrelln) +cli: Fix for -r on empty directory (#3027, @brailovich) +cli: Fix required decompression memory usage reported by -vv + --long (#3042, @u1f35c) +cli: Fix infinite loop when empty input is passed to trainer (#3081, @terrelln) +cli: Implement more gzip compatibility (#3059, @dirkmueller) +cli: Keep original file if -c or --stdout is given (#3052, @dirkmueller) +bug: Fix for block-splitter (#3033, @Cyan4973) +bug: Fixes for Sequence Compression API (#3023, #3040, @Cyan4973) +bug: Fix leaking thread handles on Windows (#3147, @animalize) +bug: Fix timing issues with cmake/meson builds (#3166, #3167, #3170, @Cyan4973) +build: Allow user to select legacy level for cmake (#3050, @shadchin) +build: Enable legacy support by default in cmake (#3079, @niamster) +build: Meson improvements (#3039, #3122, @eli-schwartz) +build: Add aarch64 to supported architectures for zstd_trace (#3054, @ooosssososos) +doc: Split help in long and short version, cleanup formatting (#3094, @dirkmueller) +doc: Updated man page, providing more details for --train mode (#3112, @Cyan4973) +doc: Add decompressor errata document (#3092, @terrelln) +misc: Enable Intel CET (#2992, #2994, @hjl-tools) +misc: Streaming decompression can detect incorrect header ID sooner (#3175, @Cyan4973) + v1.5.2 (Jan, 2022) perf: Regain Minimal memset()-ing During Reuse of Compression Contexts (@Cyan4973, #2969) build: Build Zstd with `noexecstack` on All Architectures (@felixhandte, #2964) diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index 4bbb513bb..ff9eaca36 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -1,10 +1,10 @@ -zstd 1.5.2 Manual +zstd 1.5.3 Manual -

zstd 1.5.2 Manual

+

zstd 1.5.3 Manual


Contents

    @@ -359,6 +359,7 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer */ * ZSTD_c_validateSequences * ZSTD_c_useBlockSplitter * ZSTD_c_useRowMatchFinder + * ZSTD_c_prefetchCDictTables * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. * note : never ever use experimentalParam? names directly; * also, the enums values themselves are unstable and can still change. @@ -377,7 +378,8 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer */ ZSTD_c_experimentalParam12=1009, ZSTD_c_experimentalParam13=1010, ZSTD_c_experimentalParam14=1011, - ZSTD_c_experimentalParam15=1012 + ZSTD_c_experimentalParam15=1012, + ZSTD_c_experimentalParam16=1013 } ZSTD_cParameter;

typedef struct {
@@ -790,7 +792,7 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds);  /* accept NULL pointer */
 


unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
-

Provides the dictID required to decompress the frame stored within `src`. +

Provides the dictID required to decompressed the frame stored within `src`. If @return == 0, the dictID could not be decoded. This could for one of the following reasons : - The frame does not require a dictionary to be decoded (most common case). @@ -1132,15 +1134,15 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); ZSTD_sf_explicitBlockDelimiters = 1 /* Representation of ZSTD_Sequence contains explicit block delimiters */ } ZSTD_sequenceFormat_e;


-

Generate sequences using ZSTD_compress2, given a source buffer. +

Generate sequences using ZSTD_compress2(), given a source buffer. Each block will end with a dummy sequence with offset == 0, matchLength == 0, and litLength == length of last literals. litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0) simply acts as a block delimiter. - zc can be used to insert custom compression params. - This function invokes ZSTD_compress2 + @zc can be used to insert custom compression params. + This function invokes ZSTD_compress2(). The output of this function can be fed into ZSTD_compressSequences() with CCtx setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters @@ -1150,7 +1152,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);

ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize);
 

Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals - by merging them into into the literals of the next sequence. + by merging them into the literals of the next sequence. As such, the final generated result has no explicit representation of block boundaries, and the final last literals segment is not represented in the sequences. @@ -1161,9 +1163,10 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);


-
ZSTDLIB_STATIC_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize,
-                      const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
-                      const void* src, size_t srcSize);
+
ZSTDLIB_STATIC_API size_t
+ZSTD_compressSequences( ZSTD_CCtx* cctx, void* dst, size_t dstSize,
+            const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
+            const void* src, size_t srcSize);
 

Compress an array of ZSTD_Sequence, associated with @src buffer, into dst. @src contains the entire input (not just the literals). If @srcSize > sum(sequence.length), the remaining bytes are considered all literals @@ -1191,7 +1194,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused. Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly, and cannot emit an RLE block that disagrees with the repcode history - @return : final compressed size or a ZSTD error. + @return : final compressed size, or a ZSTD error code.


@@ -1199,7 +1202,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); const void* src, size_t srcSize, unsigned magicVariant);

Generates a zstd skippable frame containing data given by src, and writes it to dst buffer. - Skippable frames begin with a a 4-byte magic number. There are 16 possible choices of magic number, + Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number, ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15. As such, the parameter magicVariant controls the exact skippable frame magic number variant used, so the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant. diff --git a/lib/zstd.h b/lib/zstd.h index 14b4b4559..4c2eee696 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -74,7 +74,7 @@ extern "C" { /*------ Version ------*/ #define ZSTD_VERSION_MAJOR 1 #define ZSTD_VERSION_MINOR 5 -#define ZSTD_VERSION_RELEASE 2 +#define ZSTD_VERSION_RELEASE 3 #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) /*! ZSTD_versionNumber() : From bb3839a78cf0dbaf2059d47936f9e3b8ff50e9d1 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 29 Jun 2022 14:55:14 -0400 Subject: [PATCH 171/472] make -C programs zstd.1 --- programs/zstd.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/zstd.1 b/programs/zstd.1 index dbdc30172..84450d8ec 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -1,5 +1,5 @@ . -.TH "ZSTD" "1" "June 2022" "zstd 1.5.2" "User Commands" +.TH "ZSTD" "1" "June 2022" "zstd 1.5.3" "User Commands" . .SH "NAME" \fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files From cd9d0a7e6e5aa770b377d738eb94de6671c5487e Mon Sep 17 00:00:00 2001 From: Taylor Braun-Jones Date: Thu, 30 Jun 2022 13:20:42 -0400 Subject: [PATCH 172/472] Fix ZSTD_BUILD_TESTS=ON build with MSVC Fixes: Command line error D8021 : invalid numeric argument '/Wno-deprecated-declarations' --- build/cmake/tests/CMakeLists.txt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/build/cmake/tests/CMakeLists.txt b/build/cmake/tests/CMakeLists.txt index 8bba6ea65..6c1ea298a 100644 --- a/build/cmake/tests/CMakeLists.txt +++ b/build/cmake/tests/CMakeLists.txt @@ -57,7 +57,9 @@ target_link_libraries(datagen libzstd_static) # fullbench # add_executable(fullbench ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${PROGRAMS_DIR}/benchfn.c ${PROGRAMS_DIR}/benchzstd.c ${TESTS_DIR}/fullbench.c) -set_property(TARGET fullbench APPEND PROPERTY COMPILE_OPTIONS "-Wno-deprecated-declarations") +if (NOT MSVC) + target_compile_options(fullbench PRIVATE "-Wno-deprecated-declarations") +endif() target_link_libraries(fullbench libzstd_static) add_test(NAME fullbench COMMAND fullbench ${ZSTD_FULLBENCH_FLAGS}) @@ -65,7 +67,9 @@ add_test(NAME fullbench COMMAND fullbench ${ZSTD_FULLBENCH_FLAGS}) # fuzzer # add_executable(fuzzer ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${TESTS_DIR}/fuzzer.c) -set_property(TARGET fuzzer APPEND PROPERTY COMPILE_OPTIONS "-Wno-deprecated-declarations") +if (NOT MSVC) + target_compile_options(fuzzer PRIVATE "-Wno-deprecated-declarations") +endif() target_link_libraries(fuzzer libzstd_static) AddTestFlagsOption(ZSTD_FUZZER_FLAGS "$ENV{FUZZERTEST} $ENV{FUZZER_FLAGS}" "Semicolon-separated list of flags to pass to the fuzzer test (see `fuzzer -h` for usage)") @@ -78,7 +82,9 @@ add_test(NAME fuzzer COMMAND fuzzer ${ZSTD_FUZZER_FLAGS}) # zstreamtest # add_executable(zstreamtest ${PROGRAMS_DIR}/datagen.c ${PROGRAMS_DIR}/util.c ${PROGRAMS_DIR}/timefn.c ${TESTS_DIR}/seqgen.c ${TESTS_DIR}/zstreamtest.c) -set_property(TARGET zstreamtest APPEND PROPERTY COMPILE_OPTIONS "-Wno-deprecated-declarations") +if (NOT MSVC) + target_compile_options(zstreamtest PRIVATE "-Wno-deprecated-declarations") +endif() target_link_libraries(zstreamtest libzstd_static) AddTestFlagsOption(ZSTD_ZSTREAM_FLAGS "$ENV{ZSTREAM_TESTTIME} $ENV{FUZZER_FLAGS}" "Semicolon-separated list of flags to pass to the zstreamtest test (see `zstreamtest -h` for usage)") From cc8c98485a7c1f9837e13662649711dc842f2c02 Mon Sep 17 00:00:00 2001 From: htnhan Date: Tue, 5 Jul 2022 21:28:33 -0500 Subject: [PATCH 173/472] zstd -lv to show dictID --- programs/fileio.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/programs/fileio.c b/programs/fileio.c index 3c47e3f5b..86906bed3 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -2721,6 +2721,7 @@ typedef struct { int decompUnavailable; int usesCheck; U32 nbFiles; + unsigned dictID; } fileInfo_t; typedef enum { @@ -2775,6 +2776,7 @@ FIO_analyzeFrames(fileInfo_t* info, FILE* const srcFile) } ERROR_IF(ZSTD_getFrameHeader(&header, headerBuffer, numBytesRead) != 0, info_frame_error, "Error: could not decode frame header"); + info->dictID = header.dictID; info->windowSize = header.windowSize; /* move to the end of the frame header */ { size_t const headerSize = ZSTD_frameHeaderSize(headerBuffer, numBytesRead); @@ -2887,6 +2889,7 @@ displayInfo(const char* inFileName, const fileInfo_t* info, int displayLevel) DISPLAYOUT("# Zstandard Frames: %d\n", info->numActualFrames); if (info->numSkippableFrames) DISPLAYOUT("# Skippable Frames: %d\n", info->numSkippableFrames); + DISPLAYOUT("DictID: %u\n", info->dictID); DISPLAYOUT("Window Size: %.*f%s (%llu B)\n", window_hrs.precision, window_hrs.value, window_hrs.suffix, (unsigned long long)info->windowSize); From d7eb829af5428f62b9308917232207d0dc92292c Mon Sep 17 00:00:00 2001 From: htnhan Date: Fri, 8 Jul 2022 12:20:50 -0500 Subject: [PATCH 174/472] Detect multiple dictIDs in one file --- programs/fileio.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/programs/fileio.c b/programs/fileio.c index 86906bed3..b8b2818bc 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -2776,7 +2776,12 @@ FIO_analyzeFrames(fileInfo_t* info, FILE* const srcFile) } ERROR_IF(ZSTD_getFrameHeader(&header, headerBuffer, numBytesRead) != 0, info_frame_error, "Error: could not decode frame header"); - info->dictID = header.dictID; + if (info->dictID != 0 && info->dictID != header.dictID) { + DISPLAY("WARNING: File contains multiple frames with different dictionary IDs. Showing dictID 0 instead"); + info->dictID = 0; + } else { + info->dictID = header.dictID; + } info->windowSize = header.windowSize; /* move to the end of the frame header */ { size_t const headerSize = ZSTD_frameHeaderSize(headerBuffer, numBytesRead); From 962746edffa5340315136af34ac3331eba82c3c8 Mon Sep 17 00:00:00 2001 From: Miles HU Date: Fri, 8 Jul 2022 15:01:36 -0700 Subject: [PATCH 175/472] T119975957 Signed-off-by: Miles HU --- lib/compress/zstd_compress.c | 98 -------------------------------- lib/decompress/zstd_decompress.c | 7 --- lib/zstd.h | 2 - tests/fuzzer.c | 13 ----- 4 files changed, 120 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index b1f9bba8a..1e853e215 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2243,104 +2243,6 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx, } } -/*! ZSTD_copyCCtx_internal() : - * 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()). - * The "context", in this case, refers to the hash and chain tables, - * entropy tables, and dictionary references. - * `windowLog` value is enforced if != 0, otherwise value is copied from srcCCtx. - * @return : 0, or an error code */ -static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx, - const ZSTD_CCtx* srcCCtx, - ZSTD_frameParameters fParams, - U64 pledgedSrcSize, - ZSTD_buffered_policy_e zbuff) -{ - RETURN_ERROR_IF(srcCCtx->stage!=ZSTDcs_init, stage_wrong, - "Can't copy a ctx that's not in init stage."); - DEBUGLOG(5, "ZSTD_copyCCtx_internal"); - ZSTD_memcpy(&dstCCtx->customMem, &srcCCtx->customMem, sizeof(ZSTD_customMem)); - { ZSTD_CCtx_params params = dstCCtx->requestedParams; - /* Copy only compression parameters related to tables. */ - params.cParams = srcCCtx->appliedParams.cParams; - assert(srcCCtx->appliedParams.useRowMatchFinder != ZSTD_ps_auto); - assert(srcCCtx->appliedParams.useBlockSplitter != ZSTD_ps_auto); - assert(srcCCtx->appliedParams.ldmParams.enableLdm != ZSTD_ps_auto); - params.useRowMatchFinder = srcCCtx->appliedParams.useRowMatchFinder; - params.useBlockSplitter = srcCCtx->appliedParams.useBlockSplitter; - params.ldmParams = srcCCtx->appliedParams.ldmParams; - params.fParams = fParams; - ZSTD_resetCCtx_internal(dstCCtx, ¶ms, pledgedSrcSize, - /* loadedDictSize */ 0, - ZSTDcrp_leaveDirty, zbuff); - assert(dstCCtx->appliedParams.cParams.windowLog == srcCCtx->appliedParams.cParams.windowLog); - assert(dstCCtx->appliedParams.cParams.strategy == srcCCtx->appliedParams.cParams.strategy); - assert(dstCCtx->appliedParams.cParams.hashLog == srcCCtx->appliedParams.cParams.hashLog); - assert(dstCCtx->appliedParams.cParams.chainLog == srcCCtx->appliedParams.cParams.chainLog); - assert(dstCCtx->blockState.matchState.hashLog3 == srcCCtx->blockState.matchState.hashLog3); - } - - ZSTD_cwksp_mark_tables_dirty(&dstCCtx->workspace); - - /* copy tables */ - { size_t const chainSize = ZSTD_allocateChainTable(srcCCtx->appliedParams.cParams.strategy, - srcCCtx->appliedParams.useRowMatchFinder, - 0 /* forDDSDict */) - ? ((size_t)1 << srcCCtx->appliedParams.cParams.chainLog) - : 0; - size_t const hSize = (size_t)1 << srcCCtx->appliedParams.cParams.hashLog; - int const h3log = srcCCtx->blockState.matchState.hashLog3; - size_t const h3Size = h3log ? ((size_t)1 << h3log) : 0; - - ZSTD_memcpy(dstCCtx->blockState.matchState.hashTable, - srcCCtx->blockState.matchState.hashTable, - hSize * sizeof(U32)); - ZSTD_memcpy(dstCCtx->blockState.matchState.chainTable, - srcCCtx->blockState.matchState.chainTable, - chainSize * sizeof(U32)); - ZSTD_memcpy(dstCCtx->blockState.matchState.hashTable3, - srcCCtx->blockState.matchState.hashTable3, - h3Size * sizeof(U32)); - } - - ZSTD_cwksp_mark_tables_clean(&dstCCtx->workspace); - - /* copy dictionary offsets */ - { - const ZSTD_matchState_t* srcMatchState = &srcCCtx->blockState.matchState; - ZSTD_matchState_t* dstMatchState = &dstCCtx->blockState.matchState; - dstMatchState->window = srcMatchState->window; - dstMatchState->nextToUpdate = srcMatchState->nextToUpdate; - dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd; - } - dstCCtx->dictID = srcCCtx->dictID; - dstCCtx->dictContentSize = srcCCtx->dictContentSize; - - /* copy block state */ - ZSTD_memcpy(dstCCtx->blockState.prevCBlock, srcCCtx->blockState.prevCBlock, sizeof(*srcCCtx->blockState.prevCBlock)); - - return 0; -} - -/*! ZSTD_copyCCtx() : - * 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()). - * pledgedSrcSize==0 means "unknown". -* @return : 0, or an error code */ -size_t ZSTD_copyCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx, unsigned long long pledgedSrcSize) -{ - ZSTD_frameParameters fParams = { 1 /*content*/, 0 /*checksum*/, 0 /*noDictID*/ }; - ZSTD_buffered_policy_e const zbuff = srcCCtx->bufferedPolicy; - ZSTD_STATIC_ASSERT((U32)ZSTDb_buffered==1); - if (pledgedSrcSize==0) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; - fParams.contentSizeFlag = (pledgedSrcSize != ZSTD_CONTENTSIZE_UNKNOWN); - - return ZSTD_copyCCtx_internal(dstCCtx, srcCCtx, - fParams, pledgedSrcSize, - zbuff); -} - - #define ZSTD_ROWSIZE 16 /*! ZSTD_reduceTable() : * reduce table indexes by `reducerValue`, or squash to zero. diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index 5bd412df4..779028b97 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -338,13 +338,6 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx) } } -/* no longer useful */ -void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx) -{ - size_t const toCopy = (size_t)((char*)(&dstDCtx->inBuff) - (char*)dstDCtx); - ZSTD_memcpy(dstDCtx, srcDCtx, toCopy); /* no need to copy workspace */ -} - /* Given a dctx with a digested frame params, re-selects the correct ZSTD_DDict based on * the requested dict ID from the frame. If there exists a reference to the correct ZSTD_DDict, then * accordingly sets the ddict to be used to decompress the frame. diff --git a/lib/zstd.h b/lib/zstd.h index 4c2eee696..81dec7ae9 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -2413,7 +2413,6 @@ ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); Start by initializing a context. Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. - It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() Then, consume your input using ZSTD_compressContinue(). There are some important considerations to keep in mind when using this advanced function : @@ -2553,7 +2552,6 @@ ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* misc */ -ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 81c2d9dba..34b70bf59 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -623,13 +623,10 @@ static int basicUnitTests(U32 const seed, double compressibility) ZSTD_getDictID_fromDDict; ZSTD_DStream* (* const funcptr_createDStream)( ZSTD_customMem customMem) = ZSTD_createDStream_advanced; - void (* const funcptr_copyDCtx)( - ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx) = ZSTD_copyDCtx; ZSTD_nextInputType_e (* const funcptr_nextInputType)(ZSTD_DCtx* dctx) = ZSTD_nextInputType; const void *voidptr_getDictID; const void *voidptr_createDStream; - const void *voidptr_copyDCtx; const void *voidptr_nextInputType; DEBUG_STATIC_ASSERT(sizeof(funcptr_getDictID) == sizeof(voidptr_getDictID)); memcpy( @@ -641,7 +638,6 @@ static int basicUnitTests(U32 const seed, double compressibility) (const void*)&funcptr_createDStream, sizeof(void*)); memcpy( - (void*)&voidptr_copyDCtx, (const void*)&funcptr_copyDCtx, sizeof(void*)); memcpy( @@ -650,7 +646,6 @@ static int basicUnitTests(U32 const seed, double compressibility) sizeof(void*)); DISPLAYLEVEL(3, "%p ", voidptr_getDictID); DISPLAYLEVEL(3, "%p ", voidptr_createDStream); - DISPLAYLEVEL(3, "%p ", voidptr_copyDCtx); DISPLAYLEVEL(3, "%p ", voidptr_nextInputType); } DISPLAYLEVEL(3, ": OK \n"); @@ -1878,14 +1873,8 @@ static int basicUnitTests(U32 const seed, double compressibility) static const size_t dictSize = 551; assert(dctx != NULL); assert(ctxOrig != NULL); assert(ctxDuplicated != NULL); - DISPLAYLEVEL(3, "test%3i : copy context too soon : ", testNb++); - { size_t const copyResult = ZSTD_copyCCtx(ctxDuplicated, ctxOrig, 0); - if (!ZSTD_isError(copyResult)) goto _output_error; } /* error must be detected */ - DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : load dictionary into context : ", testNb++); CHECK( ZSTD_compressBegin_usingDict(ctxOrig, CNBuffer, dictSize, 2) ); - CHECK( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, 0) ); /* Begin_usingDict implies unknown srcSize, so match that */ DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : compress with flat dictionary : ", testNb++); @@ -1946,7 +1935,6 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : check content size on duplicated context : ", testNb++); { size_t const testSize = CNBuffSize / 3; CHECK( ZSTD_compressBegin(ctxOrig, ZSTD_defaultCLevel()) ); - CHECK( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, testSize) ); CHECK_VAR(cSize, ZSTD_compressEnd(ctxDuplicated, compressedBuffer, ZSTD_compressBound(testSize), (const char*)CNBuffer + dictSize, testSize) ); @@ -4060,7 +4048,6 @@ static int fuzzerTests(U32 seed, unsigned nbTests, unsigned startTest, U32 const ZSTD_parameters const p = FUZ_makeParams(cPar, fPar); CHECK_Z ( ZSTD_compressBegin_advanced(refCtx, dict, dictSize, p, 0) ); } - CHECK_Z( ZSTD_copyCCtx(ctx, refCtx, 0) ); } { U32 const nbChunks = (FUZ_rand(&lseed) & 127) + 2; From a5655e4017c223081b0345710bfef85972f4bd87 Mon Sep 17 00:00:00 2001 From: Miles HU Date: Tue, 12 Jul 2022 11:17:25 -0700 Subject: [PATCH 176/472] Revert "T119975957" This reverts commit 962746edffa5340315136af34ac3331eba82c3c8. --- lib/compress/zstd_compress.c | 98 ++++++++++++++++++++++++++++++++ lib/decompress/zstd_decompress.c | 7 +++ lib/zstd.h | 2 + tests/fuzzer.c | 13 +++++ 4 files changed, 120 insertions(+) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 1e853e215..b1f9bba8a 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2243,6 +2243,104 @@ static size_t ZSTD_resetCCtx_usingCDict(ZSTD_CCtx* cctx, } } +/*! ZSTD_copyCCtx_internal() : + * 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()). + * The "context", in this case, refers to the hash and chain tables, + * entropy tables, and dictionary references. + * `windowLog` value is enforced if != 0, otherwise value is copied from srcCCtx. + * @return : 0, or an error code */ +static size_t ZSTD_copyCCtx_internal(ZSTD_CCtx* dstCCtx, + const ZSTD_CCtx* srcCCtx, + ZSTD_frameParameters fParams, + U64 pledgedSrcSize, + ZSTD_buffered_policy_e zbuff) +{ + RETURN_ERROR_IF(srcCCtx->stage!=ZSTDcs_init, stage_wrong, + "Can't copy a ctx that's not in init stage."); + DEBUGLOG(5, "ZSTD_copyCCtx_internal"); + ZSTD_memcpy(&dstCCtx->customMem, &srcCCtx->customMem, sizeof(ZSTD_customMem)); + { ZSTD_CCtx_params params = dstCCtx->requestedParams; + /* Copy only compression parameters related to tables. */ + params.cParams = srcCCtx->appliedParams.cParams; + assert(srcCCtx->appliedParams.useRowMatchFinder != ZSTD_ps_auto); + assert(srcCCtx->appliedParams.useBlockSplitter != ZSTD_ps_auto); + assert(srcCCtx->appliedParams.ldmParams.enableLdm != ZSTD_ps_auto); + params.useRowMatchFinder = srcCCtx->appliedParams.useRowMatchFinder; + params.useBlockSplitter = srcCCtx->appliedParams.useBlockSplitter; + params.ldmParams = srcCCtx->appliedParams.ldmParams; + params.fParams = fParams; + ZSTD_resetCCtx_internal(dstCCtx, ¶ms, pledgedSrcSize, + /* loadedDictSize */ 0, + ZSTDcrp_leaveDirty, zbuff); + assert(dstCCtx->appliedParams.cParams.windowLog == srcCCtx->appliedParams.cParams.windowLog); + assert(dstCCtx->appliedParams.cParams.strategy == srcCCtx->appliedParams.cParams.strategy); + assert(dstCCtx->appliedParams.cParams.hashLog == srcCCtx->appliedParams.cParams.hashLog); + assert(dstCCtx->appliedParams.cParams.chainLog == srcCCtx->appliedParams.cParams.chainLog); + assert(dstCCtx->blockState.matchState.hashLog3 == srcCCtx->blockState.matchState.hashLog3); + } + + ZSTD_cwksp_mark_tables_dirty(&dstCCtx->workspace); + + /* copy tables */ + { size_t const chainSize = ZSTD_allocateChainTable(srcCCtx->appliedParams.cParams.strategy, + srcCCtx->appliedParams.useRowMatchFinder, + 0 /* forDDSDict */) + ? ((size_t)1 << srcCCtx->appliedParams.cParams.chainLog) + : 0; + size_t const hSize = (size_t)1 << srcCCtx->appliedParams.cParams.hashLog; + int const h3log = srcCCtx->blockState.matchState.hashLog3; + size_t const h3Size = h3log ? ((size_t)1 << h3log) : 0; + + ZSTD_memcpy(dstCCtx->blockState.matchState.hashTable, + srcCCtx->blockState.matchState.hashTable, + hSize * sizeof(U32)); + ZSTD_memcpy(dstCCtx->blockState.matchState.chainTable, + srcCCtx->blockState.matchState.chainTable, + chainSize * sizeof(U32)); + ZSTD_memcpy(dstCCtx->blockState.matchState.hashTable3, + srcCCtx->blockState.matchState.hashTable3, + h3Size * sizeof(U32)); + } + + ZSTD_cwksp_mark_tables_clean(&dstCCtx->workspace); + + /* copy dictionary offsets */ + { + const ZSTD_matchState_t* srcMatchState = &srcCCtx->blockState.matchState; + ZSTD_matchState_t* dstMatchState = &dstCCtx->blockState.matchState; + dstMatchState->window = srcMatchState->window; + dstMatchState->nextToUpdate = srcMatchState->nextToUpdate; + dstMatchState->loadedDictEnd= srcMatchState->loadedDictEnd; + } + dstCCtx->dictID = srcCCtx->dictID; + dstCCtx->dictContentSize = srcCCtx->dictContentSize; + + /* copy block state */ + ZSTD_memcpy(dstCCtx->blockState.prevCBlock, srcCCtx->blockState.prevCBlock, sizeof(*srcCCtx->blockState.prevCBlock)); + + return 0; +} + +/*! ZSTD_copyCCtx() : + * 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()). + * pledgedSrcSize==0 means "unknown". +* @return : 0, or an error code */ +size_t ZSTD_copyCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx, unsigned long long pledgedSrcSize) +{ + ZSTD_frameParameters fParams = { 1 /*content*/, 0 /*checksum*/, 0 /*noDictID*/ }; + ZSTD_buffered_policy_e const zbuff = srcCCtx->bufferedPolicy; + ZSTD_STATIC_ASSERT((U32)ZSTDb_buffered==1); + if (pledgedSrcSize==0) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; + fParams.contentSizeFlag = (pledgedSrcSize != ZSTD_CONTENTSIZE_UNKNOWN); + + return ZSTD_copyCCtx_internal(dstCCtx, srcCCtx, + fParams, pledgedSrcSize, + zbuff); +} + + #define ZSTD_ROWSIZE 16 /*! ZSTD_reduceTable() : * reduce table indexes by `reducerValue`, or squash to zero. diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index 779028b97..5bd412df4 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -338,6 +338,13 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx) } } +/* no longer useful */ +void ZSTD_copyDCtx(ZSTD_DCtx* dstDCtx, const ZSTD_DCtx* srcDCtx) +{ + size_t const toCopy = (size_t)((char*)(&dstDCtx->inBuff) - (char*)dstDCtx); + ZSTD_memcpy(dstDCtx, srcDCtx, toCopy); /* no need to copy workspace */ +} + /* Given a dctx with a digested frame params, re-selects the correct ZSTD_DDict based on * the requested dict ID from the frame. If there exists a reference to the correct ZSTD_DDict, then * accordingly sets the ddict to be used to decompress the frame. diff --git a/lib/zstd.h b/lib/zstd.h index 81dec7ae9..4c2eee696 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -2413,6 +2413,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); Start by initializing a context. Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. + It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() Then, consume your input using ZSTD_compressContinue(). There are some important considerations to keep in mind when using this advanced function : @@ -2552,6 +2553,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* misc */ +ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); diff --git a/tests/fuzzer.c b/tests/fuzzer.c index 34b70bf59..81c2d9dba 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -623,10 +623,13 @@ static int basicUnitTests(U32 const seed, double compressibility) ZSTD_getDictID_fromDDict; ZSTD_DStream* (* const funcptr_createDStream)( ZSTD_customMem customMem) = ZSTD_createDStream_advanced; + void (* const funcptr_copyDCtx)( + ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx) = ZSTD_copyDCtx; ZSTD_nextInputType_e (* const funcptr_nextInputType)(ZSTD_DCtx* dctx) = ZSTD_nextInputType; const void *voidptr_getDictID; const void *voidptr_createDStream; + const void *voidptr_copyDCtx; const void *voidptr_nextInputType; DEBUG_STATIC_ASSERT(sizeof(funcptr_getDictID) == sizeof(voidptr_getDictID)); memcpy( @@ -638,6 +641,7 @@ static int basicUnitTests(U32 const seed, double compressibility) (const void*)&funcptr_createDStream, sizeof(void*)); memcpy( + (void*)&voidptr_copyDCtx, (const void*)&funcptr_copyDCtx, sizeof(void*)); memcpy( @@ -646,6 +650,7 @@ static int basicUnitTests(U32 const seed, double compressibility) sizeof(void*)); DISPLAYLEVEL(3, "%p ", voidptr_getDictID); DISPLAYLEVEL(3, "%p ", voidptr_createDStream); + DISPLAYLEVEL(3, "%p ", voidptr_copyDCtx); DISPLAYLEVEL(3, "%p ", voidptr_nextInputType); } DISPLAYLEVEL(3, ": OK \n"); @@ -1873,8 +1878,14 @@ static int basicUnitTests(U32 const seed, double compressibility) static const size_t dictSize = 551; assert(dctx != NULL); assert(ctxOrig != NULL); assert(ctxDuplicated != NULL); + DISPLAYLEVEL(3, "test%3i : copy context too soon : ", testNb++); + { size_t const copyResult = ZSTD_copyCCtx(ctxDuplicated, ctxOrig, 0); + if (!ZSTD_isError(copyResult)) goto _output_error; } /* error must be detected */ + DISPLAYLEVEL(3, "OK \n"); + DISPLAYLEVEL(3, "test%3i : load dictionary into context : ", testNb++); CHECK( ZSTD_compressBegin_usingDict(ctxOrig, CNBuffer, dictSize, 2) ); + CHECK( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, 0) ); /* Begin_usingDict implies unknown srcSize, so match that */ DISPLAYLEVEL(3, "OK \n"); DISPLAYLEVEL(3, "test%3i : compress with flat dictionary : ", testNb++); @@ -1935,6 +1946,7 @@ static int basicUnitTests(U32 const seed, double compressibility) DISPLAYLEVEL(3, "test%3i : check content size on duplicated context : ", testNb++); { size_t const testSize = CNBuffSize / 3; CHECK( ZSTD_compressBegin(ctxOrig, ZSTD_defaultCLevel()) ); + CHECK( ZSTD_copyCCtx(ctxDuplicated, ctxOrig, testSize) ); CHECK_VAR(cSize, ZSTD_compressEnd(ctxDuplicated, compressedBuffer, ZSTD_compressBound(testSize), (const char*)CNBuffer + dictSize, testSize) ); @@ -4048,6 +4060,7 @@ static int fuzzerTests(U32 seed, unsigned nbTests, unsigned startTest, U32 const ZSTD_parameters const p = FUZ_makeParams(cPar, fPar); CHECK_Z ( ZSTD_compressBegin_advanced(refCtx, dict, dictSize, p, 0) ); } + CHECK_Z( ZSTD_copyCCtx(ctx, refCtx, 0) ); } { U32 const nbChunks = (FUZ_rand(&lseed) & 127) + 2; From 6b233d5d41d65f00ff830abf846d2939f5812f56 Mon Sep 17 00:00:00 2001 From: Miles HU Date: Wed, 13 Jul 2022 11:00:05 -0700 Subject: [PATCH 177/472] [T124890272] Mark 2 Obsolete Functions(ZSTD_copy*Ctx) Deprecated in Zstd The discussion for this task is here: facebook/zstd#3128. This task can probably be scoped to the first part: marking these functions deprecated. We'll later look at removal when we roll out v1.6.0. --- lib/zstd.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/zstd.h b/lib/zstd.h index 4c2eee696..75acd5923 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -2413,7 +2413,6 @@ ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); Start by initializing a context. Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. - It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() Then, consume your input using ZSTD_compressContinue(). There are some important considerations to keep in mind when using this advanced function : @@ -2438,6 +2437,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ +ZSTD_DEPRECATED("will be deprecated soon") ZSTDLIB_STATIC_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); @@ -2553,6 +2553,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* misc */ +ZSTD_DEPRECATED("will be deprecated soon") ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); @@ -2575,7 +2576,6 @@ ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); - It is necessary to init context before starting + compression : any ZSTD_compressBegin*() variant, including with dictionary + decompression : any ZSTD_decompressBegin*() variant, including with dictionary - + copyCCtx() and copyDCtx() can be used too - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB + If input is larger than a block size, it's necessary to split input data into multiple blocks + For inputs larger than a single block, consider using regular ZSTD_compress() instead. From 6d75b36b7f80c6289d2ec44e63986c0cbdadf03e Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 13 Jul 2022 16:54:29 -0400 Subject: [PATCH 178/472] Clarify -B docstring --- programs/README.md | 2 +- programs/zstd.1 | 2 +- programs/zstd.1.md | 2 +- programs/zstdcli.c | 2 +- zlibWrapper/examples/zwrapbench.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/programs/README.md b/programs/README.md index b88cf78d7..c192b8026 100644 --- a/programs/README.md +++ b/programs/README.md @@ -209,7 +209,7 @@ Benchmark arguments : -b# : benchmark file(s), using # compression level (default: 3) -e# : test all compression levels successively from -b# to -e# (default: 1) -i# : minimum evaluation time in seconds (default: 3s) - -B# : cut file into independent blocks of size # (default: no block) + -B# : cut file into independent chunks of size # (default: no chunking) -S : output one benchmark result per input file (default: consolidated result) --priority=rt : set process priority to real-time ``` diff --git a/programs/zstd.1 b/programs/zstd.1 index 84450d8ec..3ac7f0f3c 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -356,7 +356,7 @@ minimum evaluation time, in seconds (default: 3s), benchmark mode only . .TP \fB\-B#\fR, \fB\-\-block\-size=#\fR -cut file(s) into independent blocks of size # (default: no block) +cut file(s) into independent chunks of size # (default: no chunking) . .TP \fB\-\-priority=rt\fR diff --git a/programs/zstd.1.md b/programs/zstd.1.md index c3a878176..af18586ab 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -470,7 +470,7 @@ BENCHMARK * `-i#`: minimum evaluation time, in seconds (default: 3s), benchmark mode only * `-B#`, `--block-size=#`: - cut file(s) into independent blocks of size # (default: no block) + cut file(s) into independent chunks of size # (default: no chunking) * `--priority=rt`: set process priority to real-time diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 5586f3956..fbacb908a 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -284,7 +284,7 @@ static void usage_advanced(const char* programName) DISPLAYOUT(" -b# benchmark file(s), using # compression level (default: %d)\n", ZSTDCLI_CLEVEL_DEFAULT); DISPLAYOUT(" -e# test all compression levels successively from -b# to -e# (default: 1)\n"); DISPLAYOUT(" -i# minimum evaluation time in seconds (default: 3s)\n"); - DISPLAYOUT(" -B# cut file into independent blocks of size # (default: no block)\n"); + DISPLAYOUT(" -B# cut file into independent chunks of size # (default: no chunking)\n"); DISPLAYOUT(" -S output one benchmark result per input file (default: consolidated result)\n"); DISPLAYOUT(" --priority=rt set process priority to real-time\n"); #endif diff --git a/zlibWrapper/examples/zwrapbench.c b/zlibWrapper/examples/zwrapbench.c index 5993e51ba..8673ca348 100644 --- a/zlibWrapper/examples/zwrapbench.c +++ b/zlibWrapper/examples/zwrapbench.c @@ -836,7 +836,7 @@ static int usage(const char* programName) DISPLAY( " -b# : benchmark file(s), using # compression level (default : %d) \n", ZSTDCLI_CLEVEL_DEFAULT); DISPLAY( " -e# : test all compression levels from -bX to # (default: %d)\n", ZSTDCLI_CLEVEL_DEFAULT); DISPLAY( " -i# : minimum evaluation time in seconds (default : 3s)\n"); - DISPLAY( " -B# : cut file into independent blocks of size # (default: no block)\n"); + DISPLAY( " -B# : cut file into independent chunks of size # (default: no chunking)\n"); return 0; } From 43f21a600ec431aa615b09868f1f586b949607fb Mon Sep 17 00:00:00 2001 From: udayanbapat <104396882+udayanbapat@users.noreply.github.com> Date: Thu, 14 Jul 2022 11:54:34 -0700 Subject: [PATCH 179/472] Intial commit to address 3090. Added support to decompress empty block. (#3118) * Intial commit to address 3090. Added support to decompress empty block * Update zstd_decompress_block.c Addressed review comments for the case of 'set_basic' * Update lib/decompress/zstd_decompress_block.c Co-authored-by: Nick Terrell * Update lib/decompress/zstd_decompress_block.c Co-authored-by: Nick Terrell Co-authored-by: Nick Terrell --- lib/common/zstd_internal.h | 2 +- lib/compress/zstd_compress.c | 12 +++++++++--- lib/decompress/zstd_decompress_block.c | 6 ++++-- tests/golden-decompression/empty-block.zst | Bin 0 -> 11 bytes tests/playTests.sh | 5 ++++- 5 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 tests/golden-decompression/empty-block.zst diff --git a/lib/common/zstd_internal.h b/lib/common/zstd_internal.h index e76b8e19d..038232453 100644 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@ -93,7 +93,7 @@ typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e; #define ZSTD_FRAMECHECKSUMSIZE 4 #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */ -#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */ +#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */) /* for a non-null block */ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e; diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index b1f9bba8a..59d441b2a 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -2863,7 +2863,9 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) assert(srcSize <= ZSTD_BLOCKSIZE_MAX); /* Assert that we have correctly flushed the ctx params into the ms's copy */ ZSTD_assertEqualCParams(zc->appliedParams.cParams, ms->cParams); - if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) { + /* TODO: See 3090. We reduced MIN_CBLOCK_SIZE from 3 to 2 so to compensate we are adding + * additional 1. We need to revisit and change this logic to be more consistent */ + if (srcSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1+1) { if (zc->appliedParams.cParams.strategy >= ZSTD_btopt) { ZSTD_ldm_skipRawSeqStoreBytes(&zc->externSeqStore, srcSize); } else { @@ -4000,7 +4002,9 @@ static size_t ZSTD_compress_frameChunk(ZSTD_CCtx* cctx, ZSTD_matchState_t* const ms = &cctx->blockState.matchState; U32 const lastBlock = lastFrameChunk & (blockSize >= remaining); - RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize + MIN_CBLOCK_SIZE, + /* TODO: See 3090. We reduced MIN_CBLOCK_SIZE from 3 to 2 so to compensate we are adding + * additional 1. We need to revisit and change this logic to be more consistent */ + RETURN_ERROR_IF(dstCapacity < ZSTD_blockHeaderSize + MIN_CBLOCK_SIZE + 1, dstSize_tooSmall, "not enough space to store compressed block"); if (remaining < blockSize) blockSize = remaining; @@ -6215,7 +6219,9 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, blockSize -= additionalByteAdjustment; /* If blocks are too small, emit as a nocompress block */ - if (blockSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1) { + /* TODO: See 3090. We reduced MIN_CBLOCK_SIZE from 3 to 2 so to compensate we are adding + * additional 1. We need to revisit and change this logic to be more consistent */ + if (blockSize < MIN_CBLOCK_SIZE+ZSTD_blockHeaderSize+1+1) { cBlockSize = ZSTD_noCompressBlock(op, dstCapacity, ip, blockSize, lastBlock); FORWARD_IF_ERROR(cBlockSize, "Nocompress block failed"); DEBUGLOG(5, "Block too small, writing out nocompress block: cSize: %zu", cBlockSize); diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index 466e83b6b..6df4c3849 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -135,7 +135,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, ZSTD_FALLTHROUGH; case set_compressed: - RETURN_ERROR_IF(srcSize < 5, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 3; here we need up to 5 for case 3"); + RETURN_ERROR_IF(srcSize < 5, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need up to 5 for case 3"); { size_t lhSize, litSize, litCSize; U32 singleStream=0; U32 const lhlCode = (istart[0] >> 2) & 3; @@ -238,6 +238,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, break; case 3: lhSize = 3; + RETURN_ERROR_IF(srcSize<3, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize = 3"); litSize = MEM_readLE24(istart) >> 4; break; } @@ -280,12 +281,13 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, break; case 1: lhSize = 2; + RETURN_ERROR_IF(srcSize<3, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize+1 = 3"); litSize = MEM_readLE16(istart) >> 4; break; case 3: lhSize = 3; + RETURN_ERROR_IF(srcSize<4, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 2; here we need lhSize+1 = 4"); litSize = MEM_readLE24(istart) >> 4; - RETURN_ERROR_IF(srcSize<4, corruption_detected, "srcSize >= MIN_CBLOCK_SIZE == 3; here we need lhSize+1 = 4"); break; } RETURN_ERROR_IF(litSize > 0 && dst == NULL, dstSize_tooSmall, "NULL not handled"); diff --git a/tests/golden-decompression/empty-block.zst b/tests/golden-decompression/empty-block.zst new file mode 100644 index 0000000000000000000000000000000000000000..2a3782aff0d1a6bab62dcdc1af29b448322a84bd GIT binary patch literal 11 ScmdPcs{dDkL6m`kfdK#$tpYy) literal 0 HcmV?d00001 diff --git a/tests/playTests.sh b/tests/playTests.sh index 873c3c672..50aef5df5 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -418,8 +418,11 @@ println "\n===> decompression only tests " dd bs=1048576 count=1 if=/dev/zero of=tmp zstd -d -o tmp1 "$TESTDIR/golden-decompression/rle-first-block.zst" $DIFF -s tmp1 tmp -rm -f tmp* +touch tmp_empty +zstd -d -o tmp2 "$TESTDIR/golden-decompression/empty-block.zst" +$DIFF -s tmp2 tmp_empty +rm -f tmp* println "\n===> compress multiple files" println hello > tmp1 From d0c88afe6d5c0a29274df735a044154c6bf6deaa Mon Sep 17 00:00:00 2001 From: Han Zhu Date: Tue, 19 Jul 2022 13:55:48 -0700 Subject: [PATCH 180/472] [largeNbDicts] Fix decompression segfault in createCompressInstructions Benchmarking decompression results in a segfault in `createCompressInstructions` because `cctxParams` is NULL. Skip running that function if we are not benching compression. --- contrib/largeNbDicts/largeNbDicts.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index 66850e28c..f1a80c8e1 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -670,7 +670,9 @@ static int benchMem(slice_collection_t dstBlocks, BMK_createTimedFnState(total_time_ms, ms_per_round); decompressInstructions di = createDecompressInstructions(ddictionaries); - compressInstructions ci = createCompressInstructions(cdictionaries, cctxParams); + compressInstructions ci; + if (benchCompression) + ci = createCompressInstructions(cdictionaries, cctxParams); void* payload = benchCompression ? (void*)&ci : (void*)&di; BMK_benchParams_t const bp = { .benchFn = benchCompression ? compress : decompress, From b550f9b77e9fa11d11078735c32ba9847e5df773 Mon Sep 17 00:00:00 2001 From: Han Zhu Date: Tue, 19 Jul 2022 16:50:28 -0700 Subject: [PATCH 181/472] [largeNbDicts] Print more metrics into csv file Summary: Add column headers and data for whether it's a compression or a decompression run, compression level, nbDicts and dictAttachPref in additional to compr/decompr speed. Test Plan: Example output: ``` ./largeNbDicts Compression/Decompression,Level,nbDicts,dictAttachPref,Speed Compression,1,1,0,300.9 Compression,1,1,1,296.4 Compression,1,1,2,307.8 Compression,1,10,0,292.3 Compression,1,100,0,293.3 Compression,3,110,0,106.0 Decompression,-1,110,-1,155.6 Decompression,-1,110,-1,709.4 Decompression,-1,120,-1,709.1 Decompression,-1,120,-1,734.6 ``` --- contrib/largeNbDicts/largeNbDicts.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index f1a80c8e1..bb1c16d47 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -716,12 +716,28 @@ static int benchMem(slice_collection_t dstBlocks, csvFile = fopen(csvFileName, "wt"); assert(csvFile); fprintf(csvFile, "%s\n", exeName); + /* Print table headers */ + fprintf( + csvFile, + "Compression/Decompression,Level,nbDicts,dictAttachPref,Speed\n"); } else { fclose(csvFile); csvFile = fopen(csvFileName, "at"); assert(csvFile); } - fprintf(csvFile, "%.1f\n", bestSpeed); + + int cLevel = -1; + int dictAttachPref = -1; + if (benchCompression) { + ZSTD_CCtxParams_getParameter(cctxParams, ZSTD_c_compressionLevel, + &cLevel); + ZSTD_CCtxParams_getParameter(cctxParams, ZSTD_c_forceAttachDict, + &dictAttachPref); + } + fprintf(csvFile, "%s,%d,%ld,%d,%.1f\n", + benchCompression ? "Compression" : "Decompression", cLevel, + benchCompression ? ci.nbDicts : di.nbDicts, dictAttachPref, + bestSpeed); fclose(csvFile); free(csvFileName); From d993a288e067ea55d406f8fc547d55b9ad6e725b Mon Sep 17 00:00:00 2001 From: Han Zhu Date: Wed, 20 Jul 2022 11:14:51 -0700 Subject: [PATCH 182/472] [largeNbDicts] Add an option to print out median speed Summary: Added an option -p# where -p0 (default) sets the aggregation method to fastest speed while -p1 sets the aggregation method to median. Also added a new column in the csv file to report this option's value. Test Plan: `` $ ./largeNbDicts -1 --nbDicts=1 -D ~/benchmarks/html/html_8_16K.32K.dict ~/benchmarks/html/html_8_16K/* loading 7450 files... created src buffer of size 83.4 MB split input into 7450 blocks loading dictionary /home/zhuhan/benchmarks/html/html_8_16K.32K.dict compressing at level 1 without dictionary : Ratio=3.03 (28827863 bytes) compressed using a 32768 bytes dictionary : Ratio=4.28 (20410262 bytes) generating 1 dictionaries, using 0.1 MB of memory Compression Speed : 306.0 MB/s Fastest Speed : 310.6 MB/s $ ./largeNbDicts -1 --nbDicts=1 -p1 -D ~/benchmarks/html/html_8_16K.32K.dict ~/benchmarks/html/html_8_16K/* loading 7450 files... created src buffer of size 83.4 MB split input into 7450 blocks loading dictionary /home/zhuhan/benchmarks/html/html_8_16K.32K.dict compressing at level 1 without dictionary : Ratio=3.03 (28827863 bytes) compressed using a 32768 bytes dictionary : Ratio=4.28 (20410262 bytes) generating 1 dictionaries, using 0.1 MB of memory Compression Speed : 306.9 MB/s Median Speed : 298.4 MB/s ``` --- contrib/largeNbDicts/largeNbDicts.c | 89 ++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 22 deletions(-) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index bb1c16d47..72b4b41e9 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -19,7 +19,7 @@ /*--- Dependencies ---*/ #include /* size_t */ -#include /* malloc, free, abort */ +#include /* malloc, free, abort, qsort*/ #include /* fprintf */ #include /* UINT_MAX */ #include /* assert */ @@ -650,13 +650,40 @@ size_t decompress(const void* src, size_t srcSize, void* dst, size_t dstCapacity return result; } +typedef enum { + fastest = 0, + median = 1, +} metricAggregatePref_e; -static int benchMem(slice_collection_t dstBlocks, - slice_collection_t srcBlocks, +/* compareFunction() : + * Sort input in decreasing order when used with qsort() */ +int compareFunction(const void *a, const void *b) +{ + double x = *(const double *)a; + double y = *(const double *)b; + if (x < y) + return 1; + else if (x > y) + return -1; + return 0; +} + +double aggregateData(double *data, size_t size, + metricAggregatePref_e metricAggregatePref) +{ + qsort(data, size, sizeof(*data), compareFunction); + if (metricAggregatePref == fastest) + return data[0]; + else /* median */ + return (data[(size - 1) / 2] + data[size / 2]) / 2; +} + +static int benchMem(slice_collection_t dstBlocks, slice_collection_t srcBlocks, ddict_collection_t ddictionaries, - cdict_collection_t cdictionaries, - unsigned nbRounds, int benchCompression, - const char* exeName, ZSTD_CCtx_params* cctxParams) + cdict_collection_t cdictionaries, unsigned nbRounds, + int benchCompression, const char *exeName, + ZSTD_CCtx_params *cctxParams, + metricAggregatePref_e metricAggregatePref) { assert(dstBlocks.nbSlices == srcBlocks.nbSlices); if (benchCompression) assert(cctxParams); @@ -664,7 +691,7 @@ static int benchMem(slice_collection_t dstBlocks, unsigned const ms_per_round = RUN_TIME_DEFAULT_MS; unsigned const total_time_ms = nbRounds * ms_per_round; - double bestSpeed = 0.; + double *const speedPerRound = (double *)malloc(nbRounds * sizeof(double)); BMK_timedFnState_t* const benchState = BMK_createTimedFnState(total_time_ms, ms_per_round); @@ -688,6 +715,7 @@ static int benchMem(slice_collection_t dstBlocks, .blockResults = NULL }; + size_t roundNb = 0; for (;;) { BMK_runOutcome_t const outcome = BMK_benchTimedFn(benchState, bp); CONTROL(BMK_isSuccessful_runOutcome(outcome)); @@ -697,16 +725,24 @@ static int benchMem(slice_collection_t dstBlocks, double const dTime_sec = (double)dTime_ns / 1000000000; size_t const srcSize = result.sumOfReturn; double const speed_MBps = (double)srcSize / dTime_sec / (1 MB); - if (speed_MBps > bestSpeed) bestSpeed = speed_MBps; + speedPerRound[roundNb] = speed_MBps; if (benchCompression) - DISPLAY("Compression Speed : %.1f MB/s \r", bestSpeed); + DISPLAY("Compression Speed : %.1f MB/s \r", speed_MBps); else - DISPLAY("Decompression Speed : %.1f MB/s \r", bestSpeed); + DISPLAY("Decompression Speed : %.1f MB/s \r", speed_MBps); fflush(stdout); if (BMK_isCompleted_TimedFn(benchState)) break; + roundNb++; } DISPLAY("\n"); + /* BMK_benchTimedFn may not run exactly nbRounds iterations */ + double speedAggregated = + aggregateData(speedPerRound, roundNb + 1, metricAggregatePref); + if (metricAggregatePref == fastest) + DISPLAY("Fastest Speed : %.1f MB/s \n", speedAggregated); + else + DISPLAY("Median Speed : %.1f MB/s \n", speedAggregated); char* csvFileName = malloc(strlen(exeName) + 5); strcpy(csvFileName, exeName); @@ -719,7 +755,7 @@ static int benchMem(slice_collection_t dstBlocks, /* Print table headers */ fprintf( csvFile, - "Compression/Decompression,Level,nbDicts,dictAttachPref,Speed\n"); + "Compression/Decompression,Level,nbDicts,dictAttachPref,metricAggregatePref,Speed\n"); } else { fclose(csvFile); csvFile = fopen(csvFileName, "at"); @@ -734,10 +770,10 @@ static int benchMem(slice_collection_t dstBlocks, ZSTD_CCtxParams_getParameter(cctxParams, ZSTD_c_forceAttachDict, &dictAttachPref); } - fprintf(csvFile, "%s,%d,%ld,%d,%.1f\n", + fprintf(csvFile, "%s,%d,%ld,%d,%d,%.1f\n", benchCompression ? "Compression" : "Decompression", cLevel, benchCompression ? ci.nbDicts : di.nbDicts, dictAttachPref, - bestSpeed); + metricAggregatePref, speedAggregated); fclose(csvFile); free(csvFileName); @@ -754,13 +790,11 @@ static int benchMem(slice_collection_t dstBlocks, * dictionary : optional (can be NULL), file to load as dictionary, * if none provided : will be calculated on the fly by the program. * @return : 0 is success, 1+ otherwise */ -int bench(const char** fileNameTable, unsigned nbFiles, - const char* dictionary, - size_t blockSize, int clevel, - unsigned nbDictMax, unsigned nbBlocks, +int bench(const char **fileNameTable, unsigned nbFiles, const char *dictionary, + size_t blockSize, int clevel, unsigned nbDictMax, unsigned nbBlocks, unsigned nbRounds, int benchCompression, - ZSTD_dictContentType_e dictContentType, ZSTD_CCtx_params* cctxParams, - const char* exeName) + ZSTD_dictContentType_e dictContentType, ZSTD_CCtx_params *cctxParams, + const char *exeName, metricAggregatePref_e metricAggregatePref) { int result = 0; @@ -855,7 +889,9 @@ int bench(const char** fileNameTable, unsigned nbFiles, buffer_collection_t resultCollection = createBufferCollection_fromSliceCollection(srcSlices); CONTROL(resultCollection.buffer.ptr != NULL); - result = benchMem(dstSlices, resultCollection.slices, ddictionaries, cdictionaries, nbRounds, benchCompression, exeName, cctxParams); + result = benchMem(dstSlices, resultCollection.slices, ddictionaries, + cdictionaries, nbRounds, benchCompression, exeName, + cctxParams, metricAggregatePref); freeBufferCollection(resultCollection); } else { @@ -869,7 +905,9 @@ int bench(const char** fileNameTable, unsigned nbFiles, buffer_collection_t resultCollection = createBufferCollection_fromSliceCollectionSizes(srcSlices); CONTROL(resultCollection.buffer.ptr != NULL); - result = benchMem(resultCollection.slices, dstSlices, ddictionaries, cdictionaries, nbRounds, benchCompression, exeName, NULL); + result = benchMem(resultCollection.slices, dstSlices, ddictionaries, + cdictionaries, nbRounds, benchCompression, exeName, + NULL, metricAggregatePref); freeBufferCollection(resultCollection); } @@ -947,6 +985,7 @@ int usage(const char* exeName) DISPLAY ("-# : use compression level # (default: %u) \n", CLEVEL_DEFAULT); DISPLAY ("-D # : use # as a dictionary (default: create one) \n"); DISPLAY ("-i# : nb benchmark rounds (default: %u) \n", BENCH_TIME_DEFAULT_S); + DISPLAY ("-p# : print speed for all rounds 0=fastest 1=median (default: 0)"); DISPLAY ("--nbBlocks=#: use # blocks for bench (default: one per file) \n"); DISPLAY ("--nbDicts=# : create # dictionaries for bench (default: one per block) \n"); DISPLAY ("-h : help (this text) \n"); @@ -987,6 +1026,7 @@ int main (int argc, const char** argv) ZSTD_dictContentType_e dictContentType = ZSTD_dct_auto; ZSTD_dictAttachPref_e dictAttachPref = ZSTD_dictDefaultAttach; ZSTD_paramSwitch_e prefetchCDictTables = ZSTD_ps_auto; + metricAggregatePref_e metricAggregatePref = fastest; for (int argNb = 1; argNb < argc ; argNb++) { const char* argument = argv[argNb]; @@ -996,6 +1036,7 @@ int main (int argc, const char** argv) if (!strcmp(argument, "-r")) { recursiveMode = 1; continue; } if (!strcmp(argument, "-D")) { argNb++; assert(argNb < argc); dictionary = argv[argNb]; continue; } if (longCommandWArg(&argument, "-i")) { nbRounds = readU32FromChar(&argument); continue; } + if (longCommandWArg(&argument, "-p")) { metricAggregatePref = (int)readU32FromChar(&argument); continue;} if (longCommandWArg(&argument, "--dictionary=")) { dictionary = argument; continue; } if (longCommandWArg(&argument, "-B")) { blockSize = readU32FromChar(&argument); continue; } if (longCommandWArg(&argument, "--blockSize=")) { blockSize = readU32FromChar(&argument); continue; } @@ -1030,7 +1071,11 @@ int main (int argc, const char** argv) ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_forceAttachDict, dictAttachPref); ZSTD_CCtxParams_setParameter(cctxParams, ZSTD_c_prefetchCDictTables, prefetchCDictTables); - int result = bench(filenameTable->fileNames, (unsigned)filenameTable->tableSize, dictionary, blockSize, cLevel, nbDicts, nbBlocks, nbRounds, benchCompression, dictContentType, cctxParams, exeName); + int result = + bench(filenameTable->fileNames, (unsigned)filenameTable->tableSize, + dictionary, blockSize, cLevel, nbDicts, nbBlocks, nbRounds, + benchCompression, dictContentType, cctxParams, exeName, + metricAggregatePref); UTIL_freeFileNamesTable(filenameTable); free(nameTable); From 6255f994d35219b60d3df21535c72675d5d6a98f Mon Sep 17 00:00:00 2001 From: Han Zhu Date: Wed, 20 Jul 2022 16:01:32 -0700 Subject: [PATCH 183/472] [largeNbDicts] Second try at fixing decompression segfault to always create compressInstructions Summary: Freeing an uninitialized pointer is undefined behavior. This caused a segfault when compiling the benchmark with Clang -O3 and benching decompression. V2: always create compressInstructions but check if cctxParams is NULL before setting CCtx params to avoid segfault. Test Plan: make and run --- contrib/largeNbDicts/largeNbDicts.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index 72b4b41e9..cc489000f 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -582,7 +582,8 @@ compressInstructions createCompressInstructions(cdict_collection_t dictionaries, compressInstructions ci; ci.cctx = ZSTD_createCCtx(); CONTROL(ci.cctx != NULL); - ZSTD_CCtx_setParametersUsingCCtxParams(ci.cctx, cctxParams); + if (cctxParams) + ZSTD_CCtx_setParametersUsingCCtxParams(ci.cctx, cctxParams); ci.nbDicts = dictionaries.nbCDict; ci.dictNb = 0; ci.dictionaries = dictionaries; @@ -697,9 +698,8 @@ static int benchMem(slice_collection_t dstBlocks, slice_collection_t srcBlocks, BMK_createTimedFnState(total_time_ms, ms_per_round); decompressInstructions di = createDecompressInstructions(ddictionaries); - compressInstructions ci; - if (benchCompression) - ci = createCompressInstructions(cdictionaries, cctxParams); + compressInstructions ci = + createCompressInstructions(cdictionaries, cctxParams); void* payload = benchCompression ? (void*)&ci : (void*)&di; BMK_benchParams_t const bp = { .benchFn = benchCompression ? compress : decompress, From 85d633042dfbd0c5cc114063af69a7c19fe82e8b Mon Sep 17 00:00:00 2001 From: Mathew R Gordon <72643694+mgord9518@users.noreply.github.com> Date: Fri, 29 Jul 2022 11:17:31 -0600 Subject: [PATCH 184/472] Add transparency and optimize logo (#3218) Make the front page look better in dark GH themes --- doc/images/zstd_logo86.png | Bin 5963 -> 13069 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/images/zstd_logo86.png b/doc/images/zstd_logo86.png index 216f228061c460c4e4725785486ebcff38804fbc..8abefe21b1e172b9683392057421984f64c8c9a4 100644 GIT binary patch literal 13069 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 PP~q+A>gTe~DWM4fHjC4> delta 5771 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 Date: Sat, 30 Jul 2022 01:27:20 +0800 Subject: [PATCH 185/472] decomp: add prefetch for matched seq on aarch64 (#3164) match is used for following sequence copy. It is only updated when extDict is needed, which is a low probability case. So it can be prefetched to reduce cache miss. The benchmarks on various Arm platforms showed uplift from 1% ~ 14% with gcc-11/clang-14. Signed-off-by: Jun He Change-Id: If201af4799d2455d74c79f8387404439d7f684ae --- lib/decompress/zstd_decompress_block.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index 6df4c3849..20211f72b 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -967,6 +967,11 @@ size_t ZSTD_execSequence(BYTE* op, assert(op != NULL /* Precondition */); assert(oend_w < oend /* No underflow */); + +#if defined(__aarch64__) + /* prefetch sequence starting from match that will be used for copy later */ + PREFETCH_L1(match); +#endif /* Handle edge cases in a slow path: * - Read beyond end of literals * - Match end is within WILDCOPY_OVERLIMIT of oend From ec5fdcde198b4653ef94bbdf4cbadd1656cbcbcb Mon Sep 17 00:00:00 2001 From: Jun He Date: Sat, 30 Jul 2022 01:28:04 +0800 Subject: [PATCH 186/472] lib: add hint to generate more pipeline friendly code (#3138) With statistic data of test data files of silesia the chance of position beyond highThreshold is very low (~1.3%@L8 in most cases, all <2.5%), and is in "lowprob area". Add the branch hint so compiler can get better pipiline codegen. With this change it is observed ~1% of mozilla and xml, and slight (0.3%~0.8%) but consistent uplift on other files on Arm N1. Signed-off-by: Jun He Change-Id: Id9ba1d5c767e975290b5c1bf0ecce906544f4ade --- lib/decompress/zstd_decompress_block.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index 20211f72b..6ebda486c 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -543,7 +543,7 @@ void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt, for (i=0; i highThreshold) position = (position + step) & tableMask; /* lowprob area */ + while (UNLIKELY(position > highThreshold)) position = (position + step) & tableMask; /* lowprob area */ } } assert(position == 0); /* position must reach all cells once, otherwise normalizedCounter is incorrect */ } From e1873ad576cb478fff0e6e44ad99599cd5fd2846 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Fri, 29 Jul 2022 11:10:47 -0700 Subject: [PATCH 187/472] Fix buffer underflow for null dir1 --- programs/util.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/programs/util.c b/programs/util.c index f53eb03fb..b874344c4 100644 --- a/programs/util.c +++ b/programs/util.c @@ -870,30 +870,30 @@ static const char * trimPath(const char *pathname) static char* mallocAndJoin2Dir(const char *dir1, const char *dir2) { - const size_t dir1Size = strlen(dir1); - const size_t dir2Size = strlen(dir2); - char *outDirBuffer, *buffer, trailingChar; - assert(dir1 != NULL && dir2 != NULL); - outDirBuffer = (char *) malloc(dir1Size + dir2Size + 2); - CONTROL(outDirBuffer != NULL); + { const size_t dir1Size = strlen(dir1); + const size_t dir2Size = strlen(dir2); + char *outDirBuffer, *buffer; - memcpy(outDirBuffer, dir1, dir1Size); - outDirBuffer[dir1Size] = '\0'; + outDirBuffer = (char *) malloc(dir1Size + dir2Size + 2); + CONTROL(outDirBuffer != NULL); + + memcpy(outDirBuffer, dir1, dir1Size); + outDirBuffer[dir1Size] = '\0'; + + if (dir2[0] == '.') + return outDirBuffer; + + buffer = outDirBuffer + dir1Size; + if (dir1Size > 0 && *(buffer - 1) != PATH_SEP) { + *buffer = PATH_SEP; + buffer++; + } + memcpy(buffer, dir2, dir2Size); + buffer[dir2Size] = '\0'; - if (dir2[0] == '.') return outDirBuffer; - - buffer = outDirBuffer + dir1Size; - trailingChar = *(buffer - 1); - if (trailingChar != PATH_SEP) { - *buffer = PATH_SEP; - buffer++; } - memcpy(buffer, dir2, dir2Size); - buffer[dir2Size] = '\0'; - - return outDirBuffer; } /* this function will return NULL if input srcFileName is not valid name for mirrored output path */ From b1bbb0eb4c91d8e5d170b0cf732daacd0252e459 Mon Sep 17 00:00:00 2001 From: Qiongsi Wu <274595+qiongsiwu@users.noreply.github.com> Date: Fri, 29 Jul 2022 15:21:59 -0400 Subject: [PATCH 188/472] [AIX] Fix Compiler Flags and Bugs on AIX to Pass All Tests (#3219) * Fixing compiler warnings * Replace the old -s flag with the -Wl,-s flag * Fixing compiler warnings * Fixing the linker strip flag and tests/code not working as expected on AIX --- programs/Makefile | 2 +- programs/dibio.c | 2 +- programs/fileio.c | 2 +- programs/util.c | 3 +++ tests/playTests.sh | 2 +- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/programs/Makefile b/programs/Makefile index 16763e493..a5f5b45f2 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -242,7 +242,7 @@ zstd-pgo : $(MAKE) zstd MOREFLAGS=-fprofile-use ## zstd-small: minimal target, supporting only zstd compression and decompression. no bench. no legacy. no other format. -zstd-small: CFLAGS = -Os -s +zstd-small: CFLAGS = -Os -Wl,-s zstd-frugal zstd-small: $(ZSTDLIB_CORE_SRC) zstdcli.c util.c timefn.c fileio.c fileio_asyncio.c $(CC) $(FLAGS) -DZSTD_NOBENCH -DZSTD_NODICT -DZSTD_NOTRACE -UZSTD_LEGACY_SUPPORT -DZSTD_LEGACY_SUPPORT=0 $^ -o $@$(EXT) diff --git a/programs/dibio.c b/programs/dibio.c index f6757dd34..8643bc378 100644 --- a/programs/dibio.c +++ b/programs/dibio.c @@ -355,7 +355,7 @@ int DiB_trainFromFiles(const char* dictFileName, size_t maxDictSize, } /* Checks */ - if ((!sampleSizes) || (!srcBuffer) || (!dictBuffer)) + if ((fs.nbSamples && !sampleSizes) || (!srcBuffer) || (!dictBuffer)) EXM_THROW(12, "not enough memory for DiB_trainFiles"); /* should not happen */ if (fs.oneSampleTooLarge) { DISPLAYLEVEL(2, "! Warning : some sample(s) are very large \n"); diff --git a/programs/fileio.c b/programs/fileio.c index b8b2818bc..a83b8064a 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -219,7 +219,7 @@ static void ABRThandler(int sig) { } #endif -void FIO_addAbortHandler() +void FIO_addAbortHandler(void) { #if BACKTRACE_ENABLE signal(SIGABRT, ABRThandler); diff --git a/programs/util.c b/programs/util.c index f53eb03fb..50db70fd4 100644 --- a/programs/util.c +++ b/programs/util.c @@ -1378,6 +1378,9 @@ int UTIL_countCores(int logical) int UTIL_countCores(int logical) { + /* suppress unused parameter warning */ + (void)logical; + /* assume 1 */ return 1; } diff --git a/tests/playTests.sh b/tests/playTests.sh index 50aef5df5..0e2b0fbb2 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -317,7 +317,7 @@ zstd -d -f tmp_corrupt.zst --no-check zstd -d -f tmp_corrupt.zst --check --no-check # final flag overrides zstd -d -f tmp.zst --no-check -if [ "$isWindows" = false ]; then +if [ "$isWindows" = false ] && [ "$UNAME" != "AIX" ]; then if [ -n "$(which readelf)" ]; then println "test: check if binary has executable stack (#2963)" readelf -lW "$ZSTD_BIN" | grep 'GNU_STACK .* RW ' || die "zstd binary has executable stack!" From 1e09cffd9b15b39379810a39ffae182b4a7e7b78 Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 29 Jul 2022 12:22:10 -0700 Subject: [PATCH 189/472] zlibWrapper: Update for zlib 1.2.12 (#3217) In zlib 1.2.12 the OF macro was changed to _Z_OF breaking any project that used zlibWrapper. To fix this the OF has been changed to _Z_OF everywhere and _Z_OF is defined as OF in the case it is not yet defined for zlib 1.2.11 and older. Fixes: https://github.com/facebook/zstd/issues/3216 --- zlibWrapper/examples/example.c | 26 ++++---- zlibWrapper/examples/example_original.c | 26 ++++---- zlibWrapper/examples/minigzip.c | 34 +++++----- zlibWrapper/gzcompatibility.h | 14 ++--- zlibWrapper/gzguts.h | 18 +++--- zlibWrapper/gzlib.c | 4 +- zlibWrapper/gzread.c | 18 +++--- zlibWrapper/gzwrite.c | 8 +-- zlibWrapper/zstd_zlibwrapper.c | 82 ++++++++++++------------- zlibWrapper/zstd_zlibwrapper.h | 3 + 10 files changed, 118 insertions(+), 115 deletions(-) diff --git a/zlibWrapper/examples/example.c b/zlibWrapper/examples/example.c index 9000f7a32..d7590e312 100644 --- a/zlibWrapper/examples/example.c +++ b/zlibWrapper/examples/example.c @@ -56,26 +56,26 @@ z_const char hello[] = "hello, hello! I said hello, hello!"; const char dictionary[] = "hello, hello!"; uLong dictId; /* Adler32 value of the dictionary */ -void test_deflate OF((Byte *compr, uLong comprLen)); -void test_inflate OF((Byte *compr, uLong comprLen, +void test_deflate _Z_OF((Byte *compr, uLong comprLen)); +void test_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_large_deflate OF((Byte *compr, uLong comprLen, +void test_large_deflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_large_inflate OF((Byte *compr, uLong comprLen, +void test_large_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_flush OF((Byte *compr, uLong *comprLen)); -void test_sync OF((Byte *compr, uLong comprLen, +void test_flush _Z_OF((Byte *compr, uLong *comprLen)); +void test_sync _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_dict_deflate OF((Byte *compr, uLong comprLen)); -void test_dict_inflate OF((Byte *compr, uLong comprLen, +void test_dict_deflate _Z_OF((Byte *compr, uLong comprLen)); +void test_dict_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -int main OF((int argc, char *argv[])); +int main _Z_OF((int argc, char *argv[])); #ifdef Z_SOLO -void *myalloc OF((void *, unsigned, unsigned)); -void myfree OF((void *, void *)); +void *myalloc _Z_OF((void *, unsigned, unsigned)); +void myfree _Z_OF((void *, void *)); void *myalloc(q, n, m) void *q; @@ -102,9 +102,9 @@ static free_func zfree = myfree; static alloc_func zalloc = (alloc_func)0; static free_func zfree = (free_func)0; -void test_compress OF((Byte *compr, uLong comprLen, +void test_compress _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *fname, +void test_gzio _Z_OF((const char *fname, Byte *uncompr, uLong uncomprLen)); /* =========================================================================== diff --git a/zlibWrapper/examples/example_original.c b/zlibWrapper/examples/example_original.c index 649882bf0..5b4e4d1d8 100644 --- a/zlibWrapper/examples/example_original.c +++ b/zlibWrapper/examples/example_original.c @@ -51,26 +51,26 @@ z_const char hello[] = "hello, hello!"; const char dictionary[] = "hello"; uLong dictId; /* Adler32 value of the dictionary */ -void test_deflate OF((Byte *compr, uLong comprLen)); -void test_inflate OF((Byte *compr, uLong comprLen, +void test_deflate _Z_OF((Byte *compr, uLong comprLen)); +void test_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_large_deflate OF((Byte *compr, uLong comprLen, +void test_large_deflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_large_inflate OF((Byte *compr, uLong comprLen, +void test_large_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_flush OF((Byte *compr, uLong *comprLen)); -void test_sync OF((Byte *compr, uLong comprLen, +void test_flush _Z_OF((Byte *compr, uLong *comprLen)); +void test_sync _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_dict_deflate OF((Byte *compr, uLong comprLen)); -void test_dict_inflate OF((Byte *compr, uLong comprLen, +void test_dict_deflate _Z_OF((Byte *compr, uLong comprLen)); +void test_dict_inflate _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -int main OF((int argc, char *argv[])); +int main _Z_OF((int argc, char *argv[])); #ifdef Z_SOLO -void *myalloc OF((void *, unsigned, unsigned)); -void myfree OF((void *, void *)); +void *myalloc _Z_OF((void *, unsigned, unsigned)); +void myfree _Z_OF((void *, void *)); void *myalloc(q, n, m) void *q; @@ -94,9 +94,9 @@ static free_func zfree = myfree; static alloc_func zalloc = (alloc_func)0; static free_func zfree = (free_func)0; -void test_compress OF((Byte *compr, uLong comprLen, +void test_compress _Z_OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *fname, +void test_gzio _Z_OF((const char *fname, Byte *uncompr, uLong uncomprLen)); /* =========================================================================== diff --git a/zlibWrapper/examples/minigzip.c b/zlibWrapper/examples/minigzip.c index f67be0956..fc9d263ca 100644 --- a/zlibWrapper/examples/minigzip.c +++ b/zlibWrapper/examples/minigzip.c @@ -64,7 +64,7 @@ #if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) #ifndef WIN32 /* unlink already in stdio.h for WIN32 */ - extern int unlink OF((const char *)); + extern int unlink _Z_OF((const char *)); #endif #endif @@ -154,8 +154,8 @@ static void pwinerror (s) # include /* for unlink() */ #endif -void *myalloc OF((void *, unsigned, unsigned)); -void myfree OF((void *, void *)); +void *myalloc _Z_OF((void *, unsigned, unsigned)); +void myfree _Z_OF((void *, void *)); void *myalloc(q, n, m) void *q; @@ -180,9 +180,9 @@ typedef struct gzFile_s { z_stream strm; } *gzFile; -gzFile gzopen OF((const char *, const char *)); -gzFile gzdopen OF((int, const char *)); -gzFile gz_open OF((const char *, int, const char *)); +gzFile gzopen _Z_OF((const char *, const char *)); +gzFile gzdopen _Z_OF((int, const char *)); +gzFile gz_open _Z_OF((const char *, int, const char *)); gzFile gzopen(path, mode) const char *path; @@ -236,7 +236,7 @@ gzFile gz_open(path, fd, mode) return gz; } -int gzwrite OF((gzFile, const void *, unsigned)); +int gzwrite _Z_OF((gzFile, const void *, unsigned)); int gzwrite(gz, buf, len) gzFile gz; @@ -260,7 +260,7 @@ int gzwrite(gz, buf, len) return len; } -int gzread OF((gzFile, void *, unsigned)); +int gzread _Z_OF((gzFile, void *, unsigned)); int gzread(gz, buf, len) gzFile gz; @@ -297,7 +297,7 @@ int gzread(gz, buf, len) return len - strm->avail_out; } -int gzclose OF((gzFile)); +int gzclose _Z_OF((gzFile)); int gzclose(gz) gzFile gz; @@ -326,7 +326,7 @@ int gzclose(gz) return Z_OK; } -const char *gzerror OF((gzFile, int *)); +const char *gzerror _Z_OF((gzFile, int *)); const char *gzerror(gz, err) gzFile gz; @@ -340,15 +340,15 @@ const char *gzerror(gz, err) char *prog; -void error OF((const char *msg)); -void gz_compress OF((FILE *in, gzFile out)); +void error _Z_OF((const char *msg)); +void gz_compress _Z_OF((FILE *in, gzFile out)); #ifdef USE_MMAP -int gz_compress_mmap OF((FILE *in, gzFile out)); +int gz_compress_mmap _Z_OF((FILE *in, gzFile out)); #endif -void gz_uncompress OF((gzFile in, FILE *out)); -void file_compress OF((char *file, char *mode)); -void file_uncompress OF((char *file)); -int main OF((int argc, char *argv[])); +void gz_uncompress _Z_OF((gzFile in, FILE *out)); +void file_compress _Z_OF((char *file, char *mode)); +void file_uncompress _Z_OF((char *file)); +int main _Z_OF((int argc, char *argv[])); /* =========================================================================== * Display error message and exit diff --git a/zlibWrapper/gzcompatibility.h b/zlibWrapper/gzcompatibility.h index c1aa2b87c..3a46127b8 100644 --- a/zlibWrapper/gzcompatibility.h +++ b/zlibWrapper/gzcompatibility.h @@ -11,10 +11,10 @@ #if ZLIB_VERNUM <= 0x1240 -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_r _Z_OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w _Z_OF((gzFile file)); +ZEXTERN int ZEXPORT gzbuffer _Z_OF((gzFile file, unsigned size)); +ZEXTERN z_off_t ZEXPORT gzoffset _Z_OF((gzFile file)); #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t @@ -40,7 +40,7 @@ struct gzFile_s { #if ZLIB_VERNUM <= 0x1270 #if defined(_WIN32) && !defined(Z_SOLO) # include /* for wchar_t */ -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, +ZEXTERN gzFile ZEXPORT gzopen_w _Z_OF((const wchar_t *path, const char *mode)); #endif #endif @@ -61,8 +61,8 @@ ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, # endif # undef z_longlong #endif -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, +ZEXTERN z_size_t ZEXPORT gzfread _Z_OF((voidp buf, z_size_t size, z_size_t nitems, gzFile file)); -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, +ZEXTERN z_size_t ZEXPORT gzfwrite _Z_OF((voidpc buf, z_size_t size, z_size_t nitems, gzFile file)); #endif diff --git a/zlibWrapper/gzguts.h b/zlibWrapper/gzguts.h index b639b4be8..83db17c19 100644 --- a/zlibWrapper/gzguts.h +++ b/zlibWrapper/gzguts.h @@ -126,8 +126,8 @@ /* gz* functions always use library allocation functions */ #ifndef STDC - extern voidp malloc OF((uInt size)); - extern void free OF((voidpf ptr)); + extern voidp malloc _Z_OF((uInt size)); + extern void free _Z_OF((voidpf ptr)); #endif /* get errno and strerror definition */ @@ -145,10 +145,10 @@ /* provide prototypes for these when building zlib without LFS */ #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN gzFile ZEXPORT gzopen64 _Z_OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 _Z_OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 _Z_OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 _Z_OF((gzFile)); #endif /* default memLevel */ @@ -213,9 +213,9 @@ typedef union { } gz_statep; /* shared functions */ -void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +void ZLIB_INTERNAL gz_error _Z_OF((gz_statep, int, const char *)); #if defined UNDER_CE -char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +char ZLIB_INTERNAL *gz_strwinerror _Z_OF((DWORD error)); #endif /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t @@ -224,6 +224,6 @@ char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); #ifdef INT_MAX # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) #else -unsigned ZLIB_INTERNAL gz_intmax OF((void)); +unsigned ZLIB_INTERNAL gz_intmax _Z_OF((void)); # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) #endif diff --git a/zlibWrapper/gzlib.c b/zlibWrapper/gzlib.c index b1fb98517..e2d2a31af 100644 --- a/zlibWrapper/gzlib.c +++ b/zlibWrapper/gzlib.c @@ -19,8 +19,8 @@ #endif /* Local functions */ -local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const void *, int, const char *)); +local void gz_reset _Z_OF((gz_statep)); +local gzFile gz_open _Z_OF((const void *, int, const char *)); #if defined UNDER_CE diff --git a/zlibWrapper/gzread.c b/zlibWrapper/gzread.c index 359d17889..18955de5f 100644 --- a/zlibWrapper/gzread.c +++ b/zlibWrapper/gzread.c @@ -17,13 +17,13 @@ /* Local functions */ -local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); -local int gz_avail OF((gz_statep)); -local int gz_look OF((gz_statep)); -local int gz_decomp OF((gz_statep)); -local int gz_fetch OF((gz_statep)); -local int gz_skip OF((gz_statep, z_off64_t)); -local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); +local int gz_load _Z_OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail _Z_OF((gz_statep)); +local int gz_look _Z_OF((gz_statep)); +local int gz_decomp _Z_OF((gz_statep)); +local int gz_fetch _Z_OF((gz_statep)); +local int gz_skip _Z_OF((gz_statep, z_off64_t)); +local z_size_t gz_read _Z_OF((gz_statep, voidp, z_size_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state.state->fd, and update state.state->eof, state.state->err, and state.state->msg as appropriate. @@ -464,8 +464,8 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file) #endif #if ZLIB_VERNUM <= 0x1250 -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc _Z_OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc_ _Z_OF((gzFile file)); #endif int ZEXPORT gzgetc(file) diff --git a/zlibWrapper/gzwrite.c b/zlibWrapper/gzwrite.c index 422ff17db..277388f7f 100644 --- a/zlibWrapper/gzwrite.c +++ b/zlibWrapper/gzwrite.c @@ -11,10 +11,10 @@ #include "gzguts.h" /* Local functions */ -local int gz_init OF((gz_statep)); -local int gz_comp OF((gz_statep, int)); -local int gz_zero OF((gz_statep, z_off64_t)); -local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); +local int gz_init _Z_OF((gz_statep)); +local int gz_comp _Z_OF((gz_statep, int)); +local int gz_zero _Z_OF((gz_statep, z_off64_t)); +local z_size_t gz_write _Z_OF((gz_statep, voidpc, z_size_t)); /* Initialize state for writing a gzip file. Mark initialization by setting state.state->size to non-zero. Return -1 on a memory allocation failure, or 0 on diff --git a/zlibWrapper/zstd_zlibwrapper.c b/zlibWrapper/zstd_zlibwrapper.c index adb231f06..386c0f0ac 100644 --- a/zlibWrapper/zstd_zlibwrapper.c +++ b/zlibWrapper/zstd_zlibwrapper.c @@ -101,7 +101,7 @@ ZWRAP_decompress_type ZWRAP_getDecompressionType(void) { return g_ZWRAPdecompres const char * zstdVersion(void) { return ZSTD_VERSION_STRING; } -ZEXTERN const char * ZEXPORT z_zlibVersion OF((void)) { return zlibVersion(); } +ZEXTERN const char * ZEXPORT z_zlibVersion _Z_OF((void)) { return zlibVersion(); } static void* ZWRAP_allocFunction(void* opaque, size_t size) { @@ -260,7 +260,7 @@ static struct internal_state* convert_into_sis(void* ptr) return (struct internal_state*) ptr; } -ZEXTERN int ZEXPORT z_deflateInit_ OF((z_streamp strm, int level, +ZEXTERN int ZEXPORT z_deflateInit_ _Z_OF((z_streamp strm, int level, const char *version, int stream_size)) { ZWRAP_CCtx* zwc; @@ -287,7 +287,7 @@ ZEXTERN int ZEXPORT z_deflateInit_ OF((z_streamp strm, int level, } -ZEXTERN int ZEXPORT z_deflateInit2_ OF((z_streamp strm, int level, int method, +ZEXTERN int ZEXPORT z_deflateInit2_ _Z_OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)) @@ -319,7 +319,7 @@ int ZWRAP_deflateReset_keepDict(z_streamp strm) } -ZEXTERN int ZEXPORT z_deflateReset OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_deflateReset _Z_OF((z_streamp strm)) { LOG_WRAPPERC("- deflateReset\n"); if (!g_ZWRAP_useZSTDcompression) @@ -334,7 +334,7 @@ ZEXTERN int ZEXPORT z_deflateReset OF((z_streamp strm)) } -ZEXTERN int ZEXPORT z_deflateSetDictionary OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflateSetDictionary _Z_OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)) { @@ -359,7 +359,7 @@ ZEXTERN int ZEXPORT z_deflateSetDictionary OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_deflate OF((z_streamp strm, int flush)) +ZEXTERN int ZEXPORT z_deflate _Z_OF((z_streamp strm, int flush)) { ZWRAP_CCtx* zwc; @@ -465,7 +465,7 @@ ZEXTERN int ZEXPORT z_deflate OF((z_streamp strm, int flush)) } -ZEXTERN int ZEXPORT z_deflateEnd OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_deflateEnd _Z_OF((z_streamp strm)) { if (!g_ZWRAP_useZSTDcompression) { LOG_WRAPPERC("- deflateEnd\n"); @@ -483,7 +483,7 @@ ZEXTERN int ZEXPORT z_deflateEnd OF((z_streamp strm)) } -ZEXTERN uLong ZEXPORT z_deflateBound OF((z_streamp strm, +ZEXTERN uLong ZEXPORT z_deflateBound _Z_OF((z_streamp strm, uLong sourceLen)) { if (!g_ZWRAP_useZSTDcompression) @@ -493,7 +493,7 @@ ZEXTERN uLong ZEXPORT z_deflateBound OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_deflateParams OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflateParams _Z_OF((z_streamp strm, int level, int strategy)) { @@ -594,7 +594,7 @@ static int ZWRAPD_finishWithErrorMsg(z_streamp strm, char* message) } -ZEXTERN int ZEXPORT z_inflateInit_ OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateInit_ _Z_OF((z_streamp strm, const char* version, int stream_size)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB) { @@ -623,7 +623,7 @@ ZEXTERN int ZEXPORT z_inflateInit_ OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflateInit2_ OF((z_streamp strm, int windowBits, +ZEXTERN int ZEXPORT z_inflateInit2_ _Z_OF((z_streamp strm, int windowBits, const char *version, int stream_size)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB) { @@ -660,7 +660,7 @@ int ZWRAP_inflateReset_keepDict(z_streamp strm) } -ZEXTERN int ZEXPORT z_inflateReset OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_inflateReset _Z_OF((z_streamp strm)) { LOG_WRAPPERD("- inflateReset\n"); if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) @@ -678,7 +678,7 @@ ZEXTERN int ZEXPORT z_inflateReset OF((z_streamp strm)) #if ZLIB_VERNUM >= 0x1240 -ZEXTERN int ZEXPORT z_inflateReset2 OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateReset2 _Z_OF((z_streamp strm, int windowBits)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) @@ -696,7 +696,7 @@ ZEXTERN int ZEXPORT z_inflateReset2 OF((z_streamp strm, #endif -ZEXTERN int ZEXPORT z_inflateSetDictionary OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateSetDictionary _Z_OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)) { @@ -730,7 +730,7 @@ ZEXTERN int ZEXPORT z_inflateSetDictionary OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflate OF((z_streamp strm, int flush)) +ZEXTERN int ZEXPORT z_inflate _Z_OF((z_streamp strm, int flush)) { ZWRAP_DCtx* zwd; @@ -926,7 +926,7 @@ error: } -ZEXTERN int ZEXPORT z_inflateEnd OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_inflateEnd _Z_OF((z_streamp strm)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) return inflateEnd(strm); @@ -943,7 +943,7 @@ ZEXTERN int ZEXPORT z_inflateEnd OF((z_streamp strm)) } -ZEXTERN int ZEXPORT z_inflateSync OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_inflateSync _Z_OF((z_streamp strm)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) { return inflateSync(strm); @@ -955,7 +955,7 @@ ZEXTERN int ZEXPORT z_inflateSync OF((z_streamp strm)) /* Advanced compression functions */ -ZEXTERN int ZEXPORT z_deflateCopy OF((z_streamp dest, +ZEXTERN int ZEXPORT z_deflateCopy _Z_OF((z_streamp dest, z_streamp source)) { if (!g_ZWRAP_useZSTDcompression) @@ -964,7 +964,7 @@ ZEXTERN int ZEXPORT z_deflateCopy OF((z_streamp dest, } -ZEXTERN int ZEXPORT z_deflateTune OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflateTune _Z_OF((z_streamp strm, int good_length, int max_lazy, int nice_length, @@ -977,7 +977,7 @@ ZEXTERN int ZEXPORT z_deflateTune OF((z_streamp strm, #if ZLIB_VERNUM >= 0x1260 -ZEXTERN int ZEXPORT z_deflatePending OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflatePending _Z_OF((z_streamp strm, unsigned *pending, int *bits)) { @@ -988,7 +988,7 @@ ZEXTERN int ZEXPORT z_deflatePending OF((z_streamp strm, #endif -ZEXTERN int ZEXPORT z_deflatePrime OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflatePrime _Z_OF((z_streamp strm, int bits, int value)) { @@ -998,7 +998,7 @@ ZEXTERN int ZEXPORT z_deflatePrime OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_deflateSetHeader OF((z_streamp strm, +ZEXTERN int ZEXPORT z_deflateSetHeader _Z_OF((z_streamp strm, gz_headerp head)) { if (!g_ZWRAP_useZSTDcompression) @@ -1011,7 +1011,7 @@ ZEXTERN int ZEXPORT z_deflateSetHeader OF((z_streamp strm, /* Advanced decompression functions */ #if ZLIB_VERNUM >= 0x1280 -ZEXTERN int ZEXPORT z_inflateGetDictionary OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateGetDictionary _Z_OF((z_streamp strm, Bytef *dictionary, uInt *dictLength)) { @@ -1022,7 +1022,7 @@ ZEXTERN int ZEXPORT z_inflateGetDictionary OF((z_streamp strm, #endif -ZEXTERN int ZEXPORT z_inflateCopy OF((z_streamp dest, +ZEXTERN int ZEXPORT z_inflateCopy _Z_OF((z_streamp dest, z_streamp source)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !source->reserved) @@ -1032,7 +1032,7 @@ ZEXTERN int ZEXPORT z_inflateCopy OF((z_streamp dest, #if ZLIB_VERNUM >= 0x1240 -ZEXTERN long ZEXPORT z_inflateMark OF((z_streamp strm)) +ZEXTERN long ZEXPORT z_inflateMark _Z_OF((z_streamp strm)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) return inflateMark(strm); @@ -1041,7 +1041,7 @@ ZEXTERN long ZEXPORT z_inflateMark OF((z_streamp strm)) #endif -ZEXTERN int ZEXPORT z_inflatePrime OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflatePrime _Z_OF((z_streamp strm, int bits, int value)) { @@ -1051,7 +1051,7 @@ ZEXTERN int ZEXPORT z_inflatePrime OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflateGetHeader OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateGetHeader _Z_OF((z_streamp strm, gz_headerp head)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) @@ -1060,7 +1060,7 @@ ZEXTERN int ZEXPORT z_inflateGetHeader OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflateBackInit_ OF((z_streamp strm, int windowBits, +ZEXTERN int ZEXPORT z_inflateBackInit_ _Z_OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)) @@ -1071,7 +1071,7 @@ ZEXTERN int ZEXPORT z_inflateBackInit_ OF((z_streamp strm, int windowBits, } -ZEXTERN int ZEXPORT z_inflateBack OF((z_streamp strm, +ZEXTERN int ZEXPORT z_inflateBack _Z_OF((z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)) { @@ -1081,7 +1081,7 @@ ZEXTERN int ZEXPORT z_inflateBack OF((z_streamp strm, } -ZEXTERN int ZEXPORT z_inflateBackEnd OF((z_streamp strm)) +ZEXTERN int ZEXPORT z_inflateBackEnd _Z_OF((z_streamp strm)) { if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) return inflateBackEnd(strm); @@ -1089,14 +1089,14 @@ ZEXTERN int ZEXPORT z_inflateBackEnd OF((z_streamp strm)) } -ZEXTERN uLong ZEXPORT z_zlibCompileFlags OF((void)) { return zlibCompileFlags(); } +ZEXTERN uLong ZEXPORT z_zlibCompileFlags _Z_OF((void)) { return zlibCompileFlags(); } /* === utility functions === */ #ifndef Z_SOLO -ZEXTERN int ZEXPORT z_compress OF((Bytef *dest, uLongf *destLen, +ZEXTERN int ZEXPORT z_compress _Z_OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)) { if (!g_ZWRAP_useZSTDcompression) @@ -1115,7 +1115,7 @@ ZEXTERN int ZEXPORT z_compress OF((Bytef *dest, uLongf *destLen, } -ZEXTERN int ZEXPORT z_compress2 OF((Bytef *dest, uLongf *destLen, +ZEXTERN int ZEXPORT z_compress2 _Z_OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)) { @@ -1131,7 +1131,7 @@ ZEXTERN int ZEXPORT z_compress2 OF((Bytef *dest, uLongf *destLen, } -ZEXTERN uLong ZEXPORT z_compressBound OF((uLong sourceLen)) +ZEXTERN uLong ZEXPORT z_compressBound _Z_OF((uLong sourceLen)) { if (!g_ZWRAP_useZSTDcompression) return compressBound(sourceLen); @@ -1140,7 +1140,7 @@ ZEXTERN uLong ZEXPORT z_compressBound OF((uLong sourceLen)) } -ZEXTERN int ZEXPORT z_uncompress OF((Bytef *dest, uLongf *destLen, +ZEXTERN int ZEXPORT z_uncompress _Z_OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)) { if (!ZSTD_isFrame(source, sourceLen)) @@ -1159,24 +1159,24 @@ ZEXTERN int ZEXPORT z_uncompress OF((Bytef *dest, uLongf *destLen, /* checksum functions */ -ZEXTERN uLong ZEXPORT z_adler32 OF((uLong adler, const Bytef *buf, uInt len)) +ZEXTERN uLong ZEXPORT z_adler32 _Z_OF((uLong adler, const Bytef *buf, uInt len)) { return adler32(adler, buf, len); } -ZEXTERN uLong ZEXPORT z_crc32 OF((uLong crc, const Bytef *buf, uInt len)) +ZEXTERN uLong ZEXPORT z_crc32 _Z_OF((uLong crc, const Bytef *buf, uInt len)) { return crc32(crc, buf, len); } #if ZLIB_VERNUM >= 0x12B0 -ZEXTERN uLong ZEXPORT z_adler32_z OF((uLong adler, const Bytef *buf, z_size_t len)) +ZEXTERN uLong ZEXPORT z_adler32_z _Z_OF((uLong adler, const Bytef *buf, z_size_t len)) { return adler32_z(adler, buf, len); } -ZEXTERN uLong ZEXPORT z_crc32_z OF((uLong crc, const Bytef *buf, z_size_t len)) +ZEXTERN uLong ZEXPORT z_crc32_z _Z_OF((uLong crc, const Bytef *buf, z_size_t len)) { return crc32_z(crc, buf, len); } @@ -1184,14 +1184,14 @@ ZEXTERN uLong ZEXPORT z_crc32_z OF((uLong crc, const Bytef *buf, z_size_t len)) #if ZLIB_VERNUM >= 0x1270 -ZEXTERN const z_crc_t FAR * ZEXPORT z_get_crc_table OF((void)) +ZEXTERN const z_crc_t FAR * ZEXPORT z_get_crc_table _Z_OF((void)) { return get_crc_table(); } #endif /* Error function */ -ZEXTERN const char * ZEXPORT z_zError OF((int err)) +ZEXTERN const char * ZEXPORT z_zError _Z_OF((int err)) { /* Just use zlib Error function */ return zError(err); diff --git a/zlibWrapper/zstd_zlibwrapper.h b/zlibWrapper/zstd_zlibwrapper.h index 042ab9f84..c39cf6379 100644 --- a/zlibWrapper/zstd_zlibwrapper.h +++ b/zlibWrapper/zstd_zlibwrapper.h @@ -25,6 +25,9 @@ extern "C" { #define z_const #endif +#if !defined(_Z_OF) + #define _Z_OF OF +#endif /* returns a string with version of zstd library */ const char * zstdVersion(void); From 2b9fde932b53502ca6fb59d9a9d7ca781ffeae55 Mon Sep 17 00:00:00 2001 From: Chris Burgess <9002722+cgbur@users.noreply.github.com> Date: Fri, 29 Jul 2022 15:22:46 -0400 Subject: [PATCH 190/472] Fix small file passthrough (#3215) --- programs/fileio.c | 5 ++++- tests/playTests.sh | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/programs/fileio.c b/programs/fileio.c index a83b8064a..7a479069a 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -2346,7 +2346,10 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, break; /* no more input */ } readSomething = 1; /* there is at least 1 byte in srcFile */ - if (ress.readCtx->srcBufferLoaded < toRead) { + if (ress.readCtx->srcBufferLoaded < toRead) { /* not enough input to check magic number */ + if ((prefs->overwrite) && !strcmp (dstFileName, stdoutmark)) { /* pass-through mode */ + return FIO_passThrough(&ress); + } DISPLAYLEVEL(1, "zstd: %s: unknown header \n", srcFileName); return 1; } diff --git a/tests/playTests.sh b/tests/playTests.sh index 0e2b0fbb2..7c111e7a3 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -808,6 +808,16 @@ println "Hello world 1!" | zstd -df println "Hello world 2!" | zstd -dcf println "Hello world 3!" > tmp1 zstd -dcf tmp1 +println "" | zstd -df > tmp1 +println "" > tmp2 +$DIFF -q tmp1 tmp2 +println "1" | zstd -df > tmp1 +println "1" > tmp2 +$DIFF -q tmp1 tmp2 +println "12" | zstd -df > tmp1 +println "12" > tmp2 +$DIFF -q tmp1 tmp2 +rm -rf tmp* println "\n===> frame concatenation " From d4a5bc4efc40e090bf55a1a9221b6ab26b17b302 Mon Sep 17 00:00:00 2001 From: Tom Wang Date: Fri, 29 Jul 2022 12:51:58 -0700 Subject: [PATCH 191/472] Add warning when multi-thread decompression is requested (#3208) When user pass in argument for both decompression and multi-thread, print a warning message to indicate that multi-threaded decompression is not supported. * Add warning when multi-thread decompression is requested * add test case for multi-threaded decoding warning Expectation is for -d -T0 we will not throw any warning, and see warning for any other -d -T(>1) inputs --- programs/zstdcli.c | 3 +++ tests/cli-tests/compression/multi-threaded.sh | 4 ++++ tests/cli-tests/compression/multi-threaded.sh.stderr.exact | 1 + 3 files changed, 8 insertions(+) create mode 100644 tests/cli-tests/compression/multi-threaded.sh.stderr.exact diff --git a/programs/zstdcli.c b/programs/zstdcli.c index fbacb908a..372b7d7a3 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -1226,6 +1226,9 @@ int main(int argCount, const char* argv[]) DISPLAYLEVEL(3, WELCOME_MESSAGE); #ifdef ZSTD_MULTITHREAD + if ((operation==zom_decompress) && (!singleThread) && (nbWorkers > 1)) { + DISPLAYLEVEL(2, "Warning : decompression does not support multi-threading\n"); + } if ((nbWorkers==0) && (!singleThread)) { /* automatically set # workers based on # of reported cpus */ if (defaultLogicalCores) { diff --git a/tests/cli-tests/compression/multi-threaded.sh b/tests/cli-tests/compression/multi-threaded.sh index e3961330a..bd01448e2 100755 --- a/tests/cli-tests/compression/multi-threaded.sh +++ b/tests/cli-tests/compression/multi-threaded.sh @@ -9,3 +9,7 @@ zstd --rsyncable -f file ; zstd -t file.zst zstd -T0 -f file ; zstd -t file.zst zstd -T0 --auto-threads=logical -f file ; zstd -t file.zst zstd -T0 --auto-threads=physical -f file; zstd -t file.zst + +# multi-thread decompression warning test +zstd -T0 -f file ; zstd -t file.zst; zstd -T0 -d file.zst -o file3 +zstd -T0 -f file ; zstd -t file.zst; zstd -T2 -d file.zst -o file4 diff --git a/tests/cli-tests/compression/multi-threaded.sh.stderr.exact b/tests/cli-tests/compression/multi-threaded.sh.stderr.exact new file mode 100644 index 000000000..54d47d8bd --- /dev/null +++ b/tests/cli-tests/compression/multi-threaded.sh.stderr.exact @@ -0,0 +1 @@ +Warning : decompression does not support multi-threading From f9f27de91c89d826c6a39c3ef44fb1b02f9a43aa Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Fri, 29 Jul 2022 14:44:22 -0700 Subject: [PATCH 192/472] Disallow empty output directory --- programs/zstdcli.c | 18 ++++++++++++++++-- tests/cli-tests/basic/output_dir.sh | 7 +++++++ .../cli-tests/basic/output_dir.sh.stderr.exact | 2 ++ .../cli-tests/basic/output_dir.sh.stdout.exact | 2 ++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100755 tests/cli-tests/basic/output_dir.sh create mode 100644 tests/cli-tests/basic/output_dir.sh.stderr.exact create mode 100644 tests/cli-tests/basic/output_dir.sh.stdout.exact diff --git a/programs/zstdcli.c b/programs/zstdcli.c index fbacb908a..1143ac3fe 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -1011,7 +1011,14 @@ int main(int argCount, const char* argv[]) if (longCommandWArg(&argument, "--stream-size=")) { streamSrcSize = readSizeTFromChar(&argument); continue; } if (longCommandWArg(&argument, "--target-compressed-block-size=")) { targetCBlockSize = readSizeTFromChar(&argument); continue; } if (longCommandWArg(&argument, "--size-hint=")) { srcSizeHint = readSizeTFromChar(&argument); continue; } - if (longCommandWArg(&argument, "--output-dir-flat")) { NEXT_FIELD(outDirName); continue; } + if (longCommandWArg(&argument, "--output-dir-flat")) { + NEXT_FIELD(outDirName); + if (strlen(outDirName) == 0) { + DISPLAY("error: output dir cannot be empty string (did you mean to pass '.' instead?)\n"); + CLEAN_RETURN(1); + } + continue; + } if (longCommandWArg(&argument, "--auto-threads")) { const char* threadDefault = NULL; NEXT_FIELD(threadDefault); @@ -1020,7 +1027,14 @@ int main(int argCount, const char* argv[]) continue; } #ifdef UTIL_HAS_MIRRORFILELIST - if (longCommandWArg(&argument, "--output-dir-mirror")) { NEXT_FIELD(outMirroredDirName); continue; } + if (longCommandWArg(&argument, "--output-dir-mirror")) { + NEXT_FIELD(outMirroredDirName); + if (strlen(outMirroredDirName) == 0) { + DISPLAY("error: output dir cannot be empty string (did you mean to pass '.' instead?)\n"); + CLEAN_RETURN(1); + } + continue; + } #endif #ifndef ZSTD_NOTRACE if (longCommandWArg(&argument, "--trace")) { char const* traceFile; NEXT_FIELD(traceFile); TRACE_enable(traceFile); continue; } diff --git a/tests/cli-tests/basic/output_dir.sh b/tests/cli-tests/basic/output_dir.sh new file mode 100755 index 000000000..a8819d292 --- /dev/null +++ b/tests/cli-tests/basic/output_dir.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +println "+ zstd -r * --output-dir-mirror=\"\"" +zstd -r * --output-dir-mirror="" && die "Should not allow empty output dir!" +println "+ zstd -r * --output-dir-flat=\"\"" +zstd -r * --output-dir-flat="" && die "Should not allow empty output dir!" +exit 0 diff --git a/tests/cli-tests/basic/output_dir.sh.stderr.exact b/tests/cli-tests/basic/output_dir.sh.stderr.exact new file mode 100644 index 000000000..e12b50427 --- /dev/null +++ b/tests/cli-tests/basic/output_dir.sh.stderr.exact @@ -0,0 +1,2 @@ +error: output dir cannot be empty string (did you mean to pass '.' instead?) +error: output dir cannot be empty string (did you mean to pass '.' instead?) diff --git a/tests/cli-tests/basic/output_dir.sh.stdout.exact b/tests/cli-tests/basic/output_dir.sh.stdout.exact new file mode 100644 index 000000000..1e478cd75 --- /dev/null +++ b/tests/cli-tests/basic/output_dir.sh.stdout.exact @@ -0,0 +1,2 @@ ++ zstd -r * --output-dir-mirror="" ++ zstd -r * --output-dir-flat="" From ae4670466c5db56493f356c1a81e8cbefef3271e Mon Sep 17 00:00:00 2001 From: Yonatan Komornik <11005061+yoniko@users.noreply.github.com> Date: Fri, 29 Jul 2022 16:13:07 -0700 Subject: [PATCH 193/472] stdin multiple file fixes (#3222) * Fixes for https://github.com/facebook/zstd/issues/3206 - bugs when handling stdin as part of multiple files. * new line at end of multiple-files.sh --- programs/fileio.c | 10 +++++++++ programs/util.c | 10 +++++++++ programs/util.h | 5 +++++ programs/zstdcli.c | 8 +++---- tests/cli-tests/compression/multiple-files.sh | 21 +++++++++++++++++++ .../multiple-files.sh.stdout.exact | 12 +++++++++++ 6 files changed, 62 insertions(+), 4 deletions(-) create mode 100755 tests/cli-tests/compression/multiple-files.sh create mode 100644 tests/cli-tests/compression/multiple-files.sh.stdout.exact diff --git a/programs/fileio.c b/programs/fileio.c index 7a479069a..27daeca93 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -1796,6 +1796,11 @@ FIO_determineCompressedName(const char* srcFileName, const char* outDirName, con char* outDirFilename = NULL; size_t sfnSize = strlen(srcFileName); size_t const srcSuffixLen = strlen(suffix); + + if(!strcmp(srcFileName, stdinmark)) { + return stdoutmark; + } + if (outDirName) { outDirFilename = FIO_createFilename_fromOutDir(srcFileName, outDirName, srcSuffixLen); sfnSize = strlen(outDirFilename); @@ -2579,6 +2584,11 @@ FIO_determineDstName(const char* srcFileName, const char* outDirName) size_t srcSuffixLen; const char* const srcSuffix = strrchr(srcFileName, '.'); + + if(!strcmp(srcFileName, stdinmark)) { + return stdoutmark; + } + if (srcSuffix == NULL) { DISPLAYLEVEL(1, "zstd: %s: unknown suffix (%s expected). " diff --git a/programs/util.c b/programs/util.c index 50db70fd4..c925adabc 100644 --- a/programs/util.c +++ b/programs/util.c @@ -509,6 +509,16 @@ FileNamesTable* UTIL_allocateFileNamesTable(size_t tableSize) return fnt; } +int UTIL_searchFileNamesTable(FileNamesTable* table, char const* name) { + size_t i; + for(i=0 ;i < table->tableSize; i++) { + if(!strcmp(table->fileNames[i], name)) { + return (int)i; + } + } + return -1; +} + void UTIL_refFilename(FileNamesTable* fnt, const char* filename) { assert(fnt->tableSize < fnt->tableCapacity); diff --git a/programs/util.h b/programs/util.h index add165d57..faf8c9f11 100644 --- a/programs/util.h +++ b/programs/util.h @@ -269,6 +269,11 @@ UTIL_createFNT_fromROTable(const char** filenames, size_t nbFilenames); */ FileNamesTable* UTIL_allocateFileNamesTable(size_t tableSize); +/*! UTIL_searchFileNamesTable() : + * Searched through entries in FileNamesTable for a specific name. + * @return : index of entry if found or -1 if not found + */ +int UTIL_searchFileNamesTable(FileNamesTable* table, char const* name); /*! UTIL_refFilename() : * Add a reference to read-only name into @fnt table. diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 372b7d7a3..71b0dbefe 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -1391,19 +1391,19 @@ int main(int argCount, const char* argv[]) UTIL_refFilename(filenames, stdinmark); } - if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName) + if (filenames->tableSize == 1 && !strcmp(filenames->fileNames[0], stdinmark) && !outFileName) outFileName = stdoutmark; /* when input is stdin, default output is stdout */ /* Check if input/output defined as console; trigger an error in this case */ if (!forceStdin - && !strcmp(filenames->fileNames[0], stdinmark) + && (UTIL_searchFileNamesTable(filenames, stdinmark) != -1) && IS_CONSOLE(stdin) ) { DISPLAYLEVEL(1, "stdin is a console, aborting\n"); CLEAN_RETURN(1); } - if ( outFileName && !strcmp(outFileName, stdoutmark) + if ( (!outFileName || !strcmp(outFileName, stdoutmark)) && IS_CONSOLE(stdout) - && !strcmp(filenames->fileNames[0], stdinmark) + && (UTIL_searchFileNamesTable(filenames, stdinmark) != -1) && !forceStdout && operation!=zom_decompress ) { DISPLAYLEVEL(1, "stdout is a console, aborting\n"); diff --git a/tests/cli-tests/compression/multiple-files.sh b/tests/cli-tests/compression/multiple-files.sh new file mode 100755 index 000000000..aeb74cf25 --- /dev/null +++ b/tests/cli-tests/compression/multiple-files.sh @@ -0,0 +1,21 @@ +#!/bin/sh +set -e + +# setup +echo "file1" > file1 +echo "file2" > file2 + +echo "Test zstd ./file1 - file2" +rm -f ./file*.zst +echo "stdin" | zstd ./file1 - ./file2 | zstd -d +cat file1.zst | zstd -d +cat file2.zst | zstd -d + +echo "Test zstd -d ./file1.zst - file2.zst" +rm ./file1 ./file2 +echo "stdin" | zstd - | zstd -d ./file1.zst - file2.zst +cat file1 +cat file2 + +echo "zstd -d ./file1.zst - file2.zst -c" +echo "stdin" | zstd | zstd -d ./file1.zst - file2.zst -c diff --git a/tests/cli-tests/compression/multiple-files.sh.stdout.exact b/tests/cli-tests/compression/multiple-files.sh.stdout.exact new file mode 100644 index 000000000..aad61d635 --- /dev/null +++ b/tests/cli-tests/compression/multiple-files.sh.stdout.exact @@ -0,0 +1,12 @@ +Test zstd ./file1 - file2 +stdin +file1 +file2 +Test zstd -d ./file1.zst - file2.zst +stdin +file1 +file2 +zstd -d ./file1.zst - file2.zst -c +file1 +stdin +file2 From 1b445c1c2e89982ad7be6b7fa13a9a1bdc658cb2 Mon Sep 17 00:00:00 2001 From: Qiongsi Wu <274595+qiongsiwu@users.noreply.github.com> Date: Mon, 1 Aug 2022 13:41:24 -0400 Subject: [PATCH 194/472] Fix hash4Ptr for big endian (#3227) --- lib/compress/zstd_compress_internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 4771b15ba..baa726f7d 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -759,7 +759,7 @@ MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_ static const U32 prime4bytes = 2654435761U; static U32 ZSTD_hash4(U32 u, U32 h) { assert(h <= 32); return (u * prime4bytes) >> (32-h) ; } -static size_t ZSTD_hash4Ptr(const void* ptr, U32 h) { return ZSTD_hash4(MEM_read32(ptr), h); } +static size_t ZSTD_hash4Ptr(const void* ptr, U32 h) { return ZSTD_hash4(MEM_readLE32(ptr), h); } static const U64 prime5bytes = 889523592379ULL; static size_t ZSTD_hash5(U64 u, U32 h) { assert(h <= 64); return (size_t)(((u << (64-40)) * prime5bytes) >> (64-h)) ; } From 0f4fd28a64880bdd1c14847983d5a7561950d8d5 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Mon, 1 Aug 2022 11:52:14 -0700 Subject: [PATCH 195/472] Deprecate ZSTD_getDecompressedSize() (#3225) Fixes #3158. Mark ZSTD_getDecompressedSize() as deprecated and replaced by ZSTD_getFrameContentSize(). --- doc/zstd_manual.html | 31 +++++++++++++++-------- lib/zstd.h | 59 +++++++++++++++++++++++++++----------------- 2 files changed, 57 insertions(+), 33 deletions(-) diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index ff9eaca36..cca287b72 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -121,7 +121,9 @@ unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize); note 6 : This function replaces ZSTD_getDecompressedSize()


-
unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
+
ZSTDLIB_API
+ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize")
+unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
 

NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize(). Both functions work the same way, but ZSTD_getDecompressedSize() blends "empty", "unknown" and "error" results to the same return value (0), @@ -1379,7 +1381,8 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPo This function never fails (wide contract)


-
ZSTD_DEPRECATED("use ZSTD_compress2")
+
ZSTDLIB_STATIC_API
+ZSTD_DEPRECATED("use ZSTD_compress2")
 size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
                               void* dst, size_t dstCapacity,
                         const void* src, size_t srcSize,
@@ -1390,7 +1393,8 @@ size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
   This prototype will generate compilation warnings. 
 


-
ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary")
+
ZSTDLIB_STATIC_API
+ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary")
 size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
                                   void* dst, size_t dstCapacity,
                             const void* src, size_t srcSize,
@@ -1551,7 +1555,8 @@ ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);  /*
  
 


-
ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead")
+
ZSTDLIB_STATIC_API
+ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead")
 size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
 

This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter(). Instruct the decoder context about what kind of data to decode next. @@ -1577,7 +1582,8 @@ size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);

Advanced Streaming compression functions


-
ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+
ZSTDLIB_STATIC_API
+ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
 size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
              int compressionLevel,
              unsigned long long pledgedSrcSize);
@@ -1594,7 +1600,8 @@ size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
  
 


-
ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+
ZSTDLIB_STATIC_API
+ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
 size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
          const void* dict, size_t dictSize,
                int compressionLevel);
@@ -1611,7 +1618,8 @@ size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
  
 


-
ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+
ZSTDLIB_STATIC_API
+ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
 size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
         const void* dict, size_t dictSize,
               ZSTD_parameters params,
@@ -1632,7 +1640,8 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
  
 


-
ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
+
ZSTDLIB_STATIC_API
+ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
 size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);
 

This function is DEPRECATED, and equivalent to: ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); @@ -1643,7 +1652,8 @@ size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);


-
ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
+
ZSTDLIB_STATIC_API
+ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
 size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
                    const ZSTD_CDict* cdict,
                          ZSTD_frameParameters fParams,
@@ -1664,7 +1674,8 @@ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
  
 


-
ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+
ZSTDLIB_STATIC_API
+ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
 size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
 

This function is DEPRECATED, and is equivalent to: ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); diff --git a/lib/zstd.h b/lib/zstd.h index 4c2eee696..07586c24c 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -37,6 +37,28 @@ extern "C" { # define ZSTDLIB_API ZSTDLIB_VISIBLE #endif +/* Deprecation warnings : + * Should these warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual. + * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS. + */ +#ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS +# define ZSTD_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define ZSTD_DEPRECATED(message) [[deprecated(message)]] +# elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ >= 3) +# define ZSTD_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define ZSTD_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler") +# define ZSTD_DEPRECATED(message) +# endif +#endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */ + /******************************************************************************* Introduction @@ -165,7 +187,9 @@ ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t * "empty", "unknown" and "error" results to the same return value (0), * while ZSTD_getFrameContentSize() gives them separate return values. * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */ -ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); +ZSTDLIB_API +ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize") +unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); /*! ZSTD_findFrameCompressedSize() : Requires v1.4.0+ * `src` should point to the start of a ZSTD frame or skippable frame. @@ -1088,28 +1112,6 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); # endif #endif -/* Deprecation warnings : - * Should these warnings be a problem, it is generally possible to disable them, - * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual. - * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS. - */ -#ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS -# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API /* disable deprecation warnings */ -#else -# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ -# define ZSTD_DEPRECATED(message) [[deprecated(message)]] ZSTDLIB_STATIC_API -# elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) -# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API __attribute__((deprecated(message))) -# elif defined(__GNUC__) && (__GNUC__ >= 3) -# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API __attribute__((deprecated)) -# elif defined(_MSC_VER) -# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API __declspec(deprecated(message)) -# else -# pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler") -# define ZSTD_DEPRECATED(message) ZSTDLIB_STATIC_API -# endif -#endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */ - /**************************************************************************************** * experimental API (static linking only) **************************************************************************************** @@ -1681,6 +1683,7 @@ ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressio * Note : this function is now DEPRECATED. * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters. * This prototype will generate compilation warnings. */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use ZSTD_compress2") size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, @@ -1692,6 +1695,7 @@ size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx, * Note : this function is now DEPRECATED. * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters. * This prototype will generate compilation warnings. */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary") size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, @@ -2195,6 +2199,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParamete * This instruction is mandatory to decode data without a fully-formed header, * such ZSTD_f_zstd1_magicless for example. * @return : 0, or an error code (which can be tested using ZSTD_isError()). */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead") size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format); @@ -2231,6 +2236,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_decompressStream_simpleArgs ( * "0" also disables frame content size field. It may be enabled in the future. * This prototype will generate compilation warnings. */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, int compressionLevel, @@ -2248,6 +2254,7 @@ size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs, * it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy. * This prototype will generate compilation warnings. */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, const void* dict, size_t dictSize, @@ -2268,6 +2275,7 @@ size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs, * If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN. * This prototype will generate compilation warnings. */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, const void* dict, size_t dictSize, @@ -2282,6 +2290,7 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs, * note : cdict will just be referenced, and must outlive compression session * This prototype will generate compilation warnings. */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); @@ -2300,6 +2309,7 @@ size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict); * value ZSTD_CONTENTSIZE_UNKNOWN. * This prototype will generate compilation warnings. */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions") size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, const ZSTD_CDict* cdict, @@ -2324,6 +2334,7 @@ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs, * @return : 0, or an error code (which can be tested using ZSTD_isError()) * This prototype will generate compilation warnings. */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions") size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); @@ -2444,8 +2455,10 @@ ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size ZSTDLIB_STATIC_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* The ZSTD_compressBegin_advanced() and ZSTD_compressBegin_usingCDict_advanced() are now DEPRECATED and will generate a compiler warning */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use advanced API to access custom parameters") size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */ +ZSTDLIB_STATIC_API ZSTD_DEPRECATED("use advanced API to access custom parameters") size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize); /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */ /** From c450f9f952d22033919c71a6279b55adeb343e8e Mon Sep 17 00:00:00 2001 From: Miles HU Date: Wed, 13 Jul 2022 11:00:05 -0700 Subject: [PATCH 196/472] [T124890272] Mark 2 Obsolete Functions(ZSTD_copy*Ctx) Deprecated in Zstd The discussion for this task is here: facebook/zstd#3128. This task can probably be scoped to the first part: marking these functions deprecated. We'll later look at removal when we roll out v1.6.0. --- lib/zstd.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/zstd.h b/lib/zstd.h index 4c2eee696..ad8eec416 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -2413,7 +2413,6 @@ ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); Start by initializing a context. Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. - It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() Then, consume your input using ZSTD_compressContinue(). There are some important considerations to keep in mind when using this advanced function : @@ -2438,6 +2437,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds); ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel); ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel); ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */ +ZSTD_DEPRECATED("This function will likely be removed in the next minor release. It is misleading and has very limited utility.") ZSTDLIB_STATIC_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */ ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); @@ -2553,6 +2553,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx); ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize); /* misc */ +ZSTD_DEPRECATED("This function will likely be removed in the next minor release. It is misleading and has very limited utility.") ZSTDLIB_STATIC_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx); typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e; ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); @@ -2575,7 +2576,6 @@ ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx); - It is necessary to init context before starting + compression : any ZSTD_compressBegin*() variant, including with dictionary + decompression : any ZSTD_decompressBegin*() variant, including with dictionary - + copyCCtx() and copyDCtx() can be used too - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB + If input is larger than a block size, it's necessary to split input data into multiple blocks + For inputs larger than a single block, consider using regular ZSTD_compress() instead. From a70ca2bd7dbc74d3c9db173e3682532e18565246 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Wed, 3 Aug 2022 11:28:39 -0700 Subject: [PATCH 197/472] Fix off-by-one error in superblock mode (#3221) Fixes #3212. Long literal and match lengths had an off-by-one error in ZSTD_getSequenceLength. Fix the off-by-one error, and add a golden compression test that catches the bug. Also run all the golden tests in the cli-tests framework. --- lib/common/zstd_internal.h | 4 ++-- lib/decompress/zstd_decompress_block.c | 2 +- tests/cli-tests/compression/golden.sh | 12 ++++++++++++ tests/cli-tests/decompression/golden.sh | 7 +++++++ tests/cli-tests/dictionaries/golden.sh | 9 +++++++++ tests/cli-tests/run.py | 1 + .../large-literal-and-match-lengths | Bin 0 -> 199998 bytes 7 files changed, 32 insertions(+), 3 deletions(-) create mode 100755 tests/cli-tests/compression/golden.sh create mode 100755 tests/cli-tests/decompression/golden.sh create mode 100755 tests/cli-tests/dictionaries/golden.sh create mode 100644 tests/golden-compression/large-literal-and-match-lengths diff --git a/lib/common/zstd_internal.h b/lib/common/zstd_internal.h index 038232453..e89226702 100644 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@ -324,10 +324,10 @@ MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore seqLen.matchLength = seq->mlBase + MINMATCH; if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) { if (seqStore->longLengthType == ZSTD_llt_literalLength) { - seqLen.litLength += 0xFFFF; + seqLen.litLength += 0x10000; } if (seqStore->longLengthType == ZSTD_llt_matchLength) { - seqLen.matchLength += 0xFFFF; + seqLen.matchLength += 0x10000; } } return seqLen; diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index 6ebda486c..e1ff21582 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -1578,7 +1578,7 @@ ZSTD_decompressSequences_body(ZSTD_DCtx* dctx, const BYTE* const prefixStart = (const BYTE*)(dctx->prefixStart); const BYTE* const vBase = (const BYTE*)(dctx->virtualStart); const BYTE* const dictEnd = (const BYTE*)(dctx->dictEnd); - DEBUGLOG(5, "ZSTD_decompressSequences_body"); + DEBUGLOG(5, "ZSTD_decompressSequences_body: nbSeq = %d", nbSeq); (void)frame; /* Regen sequences */ diff --git a/tests/cli-tests/compression/golden.sh b/tests/cli-tests/compression/golden.sh new file mode 100755 index 000000000..85dd3fdb8 --- /dev/null +++ b/tests/cli-tests/compression/golden.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +set -e + +GOLDEN_DIR="$ZSTD_REPO_DIR/tests/golden-compression/" +cp -r "$GOLDEN_DIR" golden/ + +zstd -rf golden/ --output-dir-mirror golden-compressed/ +zstd -r -t golden-compressed/ + +zstd --target-compressed-block-size=1024 -rf golden/ --output-dir-mirror golden-compressed/ +zstd -r -t golden-compressed/ diff --git a/tests/cli-tests/decompression/golden.sh b/tests/cli-tests/decompression/golden.sh new file mode 100755 index 000000000..36919e692 --- /dev/null +++ b/tests/cli-tests/decompression/golden.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +GOLDEN_DIR="$ZSTD_REPO_DIR/tests/golden-decompression/" + +zstd -r -t "$GOLDEN_DIR" diff --git a/tests/cli-tests/dictionaries/golden.sh b/tests/cli-tests/dictionaries/golden.sh new file mode 100755 index 000000000..85da2ee53 --- /dev/null +++ b/tests/cli-tests/dictionaries/golden.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +GOLDEN_COMP_DIR="$ZSTD_REPO_DIR/tests/golden-compression/" +GOLDEN_DICT_DIR="$ZSTD_REPO_DIR/tests/golden-dictionaries/" + +zstd -D "$GOLDEN_DICT_DIR/http-dict-missing-symbols" "$GOLDEN_COMP_DIR/http" -o http.zst +zstd -D "$GOLDEN_DICT_DIR/http-dict-missing-symbols" -t http.zst diff --git a/tests/cli-tests/run.py b/tests/cli-tests/run.py index b91aa9841..d726fba7f 100755 --- a/tests/cli-tests/run.py +++ b/tests/cli-tests/run.py @@ -699,6 +699,7 @@ if __name__ == "__main__": if args.exec_prefix is not None: env["EXEC_PREFIX"] = args.exec_prefix env["ZSTD_SYMLINK_DIR"] = zstd_symlink_dir + env["ZSTD_REPO_DIR"] = os.path.abspath(REPO_DIR) env["DATAGEN_BIN"] = os.path.abspath(args.datagen) env["ZSTDGREP_BIN"] = os.path.abspath(args.zstdgrep) env["ZSTDLESS_BIN"] = os.path.abspath(args.zstdless) diff --git a/tests/golden-compression/large-literal-and-match-lengths b/tests/golden-compression/large-literal-and-match-lengths new file mode 100644 index 0000000000000000000000000000000000000000..fb63c32c50f44563ccb9dc3544216cab833ad6c8 GIT binary patch literal 199998 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

3b%d|T!_7fSpV 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%0DuBaNT&wio!#aFlHqp;znmEn(q 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

_bt^jhp+6Bx+R>O8@fD zZt&c&YnPwhuci`aZ%><0b#t{Q`|MluE!=+k&Ura8cHh3(MO;50-zyD0p0jV+Hp80} z%OX5I^Obb>hwO^rd3o=-?>wXE&1}E^ZvT}vBrpKOFhCc*5n5OeIz44hEcl}Izn(FhP|JUSd2yU~os_rn1-mQK$4H_qN$cvwR`?*OOy%b$mzSMmM(F4Szo4Dph zTYlBdEVVvr@;1HYQfcL;ZC{Mu>{QoXyZ+1S&k9>k^wh=0+g)>6&=sQbZ|{dLv*rohQ;_ZDxDTWK5Ra%}F+Y0pDv zD9C*<{F?7=v8dqgZjSTUpS;trS1!pn_~2l%)z&mXFs~*^X8+s;#>&%s;yScuDcDW( zk^OXS)uGrgHgT!}#k)^#dtE&>#lt&Ra$4rYt?S)QOHMLxaY~;!v)-|8;w+Bq$D)oJ z9e=9+=z{x$T79*D0=36q`$b8|PycLxXI&ucJeAUm0ZNyi1e&ykD{fSlKjyo9@sw}( z&;Psr`N$om6>B8p4g7X}nKk>3&HJq)ic@Nr9aymQj`(KB=6zD_#r^-@CGDDBX0ZFo zfq&N9Qyfy-?>XOf559P!ZMIV%YvO{%zS(|y3)B{L7i+vZP*JFUXUhFQr(7Bo=cP0; zxR|@N2ma)`Ad&n{!S(c(?GFOxdc3=F^@0XB6sC? zK=aWDnn5pTiT-$)Wjx6_V;x7hujX6-wdL=_^6n(B=?Z2Z~X_%6Yil(+Wvn(E?b%jj-@Cug`iVxT?T@WmyV~}-OBUa;v@PCq z*y&e_j;7MhMIoKvR7_S~bAC}d`&oWdbM&-Z42`5%IRYF&MLz+u04<~&!;one_mcZ8i%T3au@ znYz9rYh~)xjWzpoD_ga1w%rX#7Pw)r-|_O8mRcKE>epDVHA@xON8UK_BSQUaO_^5O zx24-9T;lxKEo{^KQT$q@gRQOX@2TXJ)&$;Hg{v(mOIdC0Vm+(4X8!y3s9+|;#zk!{ zuSFvd%gkE8EHp47F}^xt{*~Lyu71(p>DQ>1`>pPfL2%=TQ?FPK-);Uq>5p1?Uy)(% rp6x$XCmz$De)-|u#)^C Date: Wed, 3 Aug 2022 20:52:15 +0200 Subject: [PATCH 198/472] minor : fixed missing include I presume it was not detected before because "fileio.h" is probably always included after "util.h". --- programs/fileio.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/programs/fileio.h b/programs/fileio.h index 0920f7228..9fdf8e0ed 100644 --- a/programs/fileio.h +++ b/programs/fileio.h @@ -12,8 +12,9 @@ #ifndef FILEIO_H_23981798732 #define FILEIO_H_23981798732 -#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ #include "fileio_types.h" +#include "util.h" /* FileNamesTable */ +#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */ #include "../lib/zstd.h" /* ZSTD_* */ #if defined (__cplusplus) From 3dfcafacd74e5b36fad1191dc8b3a1e1cdcbcb8c Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 3 Aug 2022 21:39:35 +0200 Subject: [PATCH 199/472] fileio_types.h : avoid dependency on mem.h fileio_types.h cannot be parsed by itself because it relies on basic types defined in `lib/common/mem.h`. As for #3231, it likely wasn't detected because `mem.h` was probably included before within target files. But this is not proper. A "easy" solution would be to add the missing include, but each dependency should be considered "bad" by default, and only allowed if it brings some tangible value. In this case, since these types are only used to declare internal structure variables which are effectively only flags, I believe it's really not valuable to add a dependency on `mem.h` for this purpose while the standard `int` type can do the same job. I was expecting some compiler warnings following this change, but it turns out we don't use `-Wconversion` by default on `zstd` source code, so there is none. Nevertheless, I enabled `-Wconversion` locally and proceeded to fix a few conversion warnings in the process. Adding `-Wconversion` to the list of flags used for `zstd` is something I would be favorable over the long term, but it cannot be done overnight, because the nb of places where this warning is triggered is daunting. Better progressively reduce the nb of triggered `-Wconversion` warnings before enabling this flag by default. --- programs/fileio.c | 13 +++++++------ programs/fileio.h | 6 +++--- programs/fileio_types.h | 12 ++++++------ programs/zstdcli.c | 14 +++++++------- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index 27daeca93..165181314 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -338,7 +338,7 @@ void FIO_setCompressionType(FIO_prefs_t* const prefs, FIO_compressionType_t comp void FIO_overwriteMode(FIO_prefs_t* const prefs) { prefs->overwrite = 1; } -void FIO_setSparseWrite(FIO_prefs_t* const prefs, unsigned sparse) { prefs->sparseFileSupport = sparse; } +void FIO_setSparseWrite(FIO_prefs_t* const prefs, int sparse) { prefs->sparseFileSupport = sparse; } void FIO_setDictIDFlag(FIO_prefs_t* const prefs, int dictIDFlag) { prefs->dictIDFlag = dictIDFlag; } @@ -371,7 +371,7 @@ void FIO_setOverlapLog(FIO_prefs_t* const prefs, int overlapLog){ prefs->overlapLog = overlapLog; } -void FIO_setAdaptiveMode(FIO_prefs_t* const prefs, unsigned adapt) { +void FIO_setAdaptiveMode(FIO_prefs_t* const prefs, int adapt) { if ((adapt>0) && (prefs->nbWorkers==0)) EXM_THROW(1, "Adaptive mode is not compatible with single thread mode \n"); prefs->adaptiveMode = adapt; @@ -453,7 +453,7 @@ void FIO_setContentSize(FIO_prefs_t* const prefs, int value) prefs->contentSize = value != 0; } -void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, unsigned value) { +void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, int value) { #ifdef ZSTD_MULTITHREAD prefs->asyncIO = value; #else @@ -1306,7 +1306,7 @@ FIO_compressZstdFrame(FIO_ctx_t* const fCtx, windowLog = ZSTD_WINDOWLOG_LIMIT_DEFAULT; } else { const ZSTD_compressionParameters cParams = ZSTD_getCParams(compressionLevel, fileSize, 0); - windowLog = cParams.windowLog; + windowLog = (int)cParams.windowLog; } } windowSize = UTIL_makeHumanReadableSize(MAX(1ULL, MIN(1ULL << windowLog, pledgedSrcSize))); @@ -1726,14 +1726,15 @@ FIO_compressFilename_srcFile(FIO_ctx_t* const fCtx, return result; } -static const char* checked_index(const char* options[], size_t length, size_t index) { +static const char* +checked_index(const char* options[], size_t length, size_t index) { assert(index < length); /* Necessary to avoid warnings since -O3 will omit the above `assert` */ (void) length; return options[index]; } -#define INDEX(options, index) checked_index((options), sizeof(options) / sizeof(char*), (index)) +#define INDEX(options, index) checked_index((options), sizeof(options) / sizeof(char*), (size_t)(index)) void FIO_displayCompressionParameters(const FIO_prefs_t* prefs) { static const char* formatOptions[5] = {ZSTD_EXTENSION, GZ_EXTENSION, XZ_EXTENSION, diff --git a/programs/fileio.h b/programs/fileio.h index 0920f7228..6864a114f 100644 --- a/programs/fileio.h +++ b/programs/fileio.h @@ -70,7 +70,7 @@ void FIO_freeContext(FIO_ctx_t* const fCtx); /* FIO_prefs_t functions */ void FIO_setCompressionType(FIO_prefs_t* const prefs, FIO_compressionType_t compressionType); void FIO_overwriteMode(FIO_prefs_t* const prefs); -void FIO_setAdaptiveMode(FIO_prefs_t* const prefs, unsigned adapt); +void FIO_setAdaptiveMode(FIO_prefs_t* const prefs, int adapt); void FIO_setAdaptMin(FIO_prefs_t* const prefs, int minCLevel); void FIO_setAdaptMax(FIO_prefs_t* const prefs, int maxCLevel); void FIO_setUseRowMatchFinder(FIO_prefs_t* const prefs, int useRowMatchFinder); @@ -86,7 +86,7 @@ void FIO_setMemLimit(FIO_prefs_t* const prefs, unsigned memLimit); void FIO_setNbWorkers(FIO_prefs_t* const prefs, int nbWorkers); void FIO_setOverlapLog(FIO_prefs_t* const prefs, int overlapLog); void FIO_setRemoveSrcFile(FIO_prefs_t* const prefs, unsigned flag); -void FIO_setSparseWrite(FIO_prefs_t* const prefs, unsigned sparse); /**< 0: no sparse; 1: disable on stdout; 2: always enabled */ +void FIO_setSparseWrite(FIO_prefs_t* const prefs, int sparse); /**< 0: no sparse; 1: disable on stdout; 2: always enabled */ void FIO_setRsyncable(FIO_prefs_t* const prefs, int rsyncable); void FIO_setStreamSrcSize(FIO_prefs_t* const prefs, size_t streamSrcSize); void FIO_setTargetCBlockSize(FIO_prefs_t* const prefs, size_t targetCBlockSize); @@ -103,7 +103,7 @@ void FIO_setAllowBlockDevices(FIO_prefs_t* const prefs, int allowBlockDevices); void FIO_setPatchFromMode(FIO_prefs_t* const prefs, int value); void FIO_setContentSize(FIO_prefs_t* const prefs, int value); void FIO_displayCompressionParameters(const FIO_prefs_t* prefs); -void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, unsigned value); +void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, int value); /* FIO_ctx_t functions */ void FIO_setNbFilesTotal(FIO_ctx_t* const fCtx, int value); diff --git a/programs/fileio_types.h b/programs/fileio_types.h index cf566aa20..c47adb3ac 100644 --- a/programs/fileio_types.h +++ b/programs/fileio_types.h @@ -34,13 +34,13 @@ typedef struct FIO_prefs_s { /* Algorithm preferences */ FIO_compressionType_t compressionType; - U32 sparseFileSupport; /* 0: no sparse allowed; 1: auto (file yes, stdout no); 2: force sparse */ + int sparseFileSupport; /* 0: no sparse allowed; 1: auto (file yes, stdout no); 2: force sparse */ int dictIDFlag; int checksumFlag; int blockSize; int overlapLog; - U32 adaptiveMode; - U32 useRowMatchFinder; + int adaptiveMode; + int useRowMatchFinder; int rsyncable; int minAdaptLevel; int maxAdaptLevel; @@ -56,9 +56,9 @@ typedef struct FIO_prefs_s { ZSTD_paramSwitch_e literalCompressionMode; /* IO preferences */ - U32 removeSrcFile; - U32 overwrite; - U32 asyncIO; + int removeSrcFile; + int overwrite; + int asyncIO; /* Computation resources preferences */ unsigned memLimit; diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 86914452c..379a3f83f 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -801,7 +801,6 @@ int main(int argCount, const char* argv[]) hasStdout = 0, ldmFlag = 0, main_pause = 0, - nbWorkers = 0, adapt = 0, useRowMatchFinder = 0, adaptMin = MINCLEVEL, @@ -816,6 +815,7 @@ int main(int argCount, const char* argv[]) showDefaultCParams = 0, ultra=0, contentSize=1; + unsigned nbWorkers = 0; double compressibility = 0.5; unsigned bench_nbSeconds = 3; /* would be better if this value was synchronized from bench */ size_t blockSize = 0; @@ -1200,7 +1200,7 @@ int main(int argCount, const char* argv[]) /* nb of threads (hidden option) */ case 'T': argument++; - nbWorkers = (int)readU32FromChar(&argument); + nbWorkers = readU32FromChar(&argument); break; /* Dictionary Selection level */ @@ -1246,10 +1246,10 @@ int main(int argCount, const char* argv[]) if ((nbWorkers==0) && (!singleThread)) { /* automatically set # workers based on # of reported cpus */ if (defaultLogicalCores) { - nbWorkers = UTIL_countLogicalCores(); + nbWorkers = (unsigned)UTIL_countLogicalCores(); DISPLAYLEVEL(3, "Note: %d logical core(s) detected \n", nbWorkers); } else { - nbWorkers = UTIL_countPhysicalCores(); + nbWorkers = (unsigned)UTIL_countPhysicalCores(); DISPLAYLEVEL(3, "Note: %d physical core(s) detected \n", nbWorkers); } } @@ -1313,7 +1313,7 @@ int main(int argCount, const char* argv[]) if (operation==zom_bench) { #ifndef ZSTD_NOBENCH benchParams.blockSize = blockSize; - benchParams.nbWorkers = nbWorkers; + benchParams.nbWorkers = (int)nbWorkers; benchParams.realTime = (unsigned)setRealTimePrio; benchParams.nbSeconds = bench_nbSeconds; benchParams.ldmFlag = ldmFlag; @@ -1474,7 +1474,7 @@ int main(int argCount, const char* argv[]) if (operation==zom_compress) { #ifndef ZSTD_NOCOMPRESS FIO_setContentSize(prefs, contentSize); - FIO_setNbWorkers(prefs, nbWorkers); + FIO_setNbWorkers(prefs, (int)nbWorkers); FIO_setBlockSize(prefs, (int)blockSize); if (g_overlapLog!=OVERLAP_LOG_DEFAULT) FIO_setOverlapLog(prefs, (int)g_overlapLog); FIO_setLdmFlag(prefs, (unsigned)ldmFlag); @@ -1482,7 +1482,7 @@ int main(int argCount, const char* argv[]) FIO_setLdmMinMatch(prefs, (int)g_ldmMinMatch); if (g_ldmBucketSizeLog != LDM_PARAM_DEFAULT) FIO_setLdmBucketSizeLog(prefs, (int)g_ldmBucketSizeLog); if (g_ldmHashRateLog != LDM_PARAM_DEFAULT) FIO_setLdmHashRateLog(prefs, (int)g_ldmHashRateLog); - FIO_setAdaptiveMode(prefs, (unsigned)adapt); + FIO_setAdaptiveMode(prefs, adapt); FIO_setUseRowMatchFinder(prefs, useRowMatchFinder); FIO_setAdaptMin(prefs, adaptMin); FIO_setAdaptMax(prefs, adaptMax); From d0dcc9d775789af73f44accb318579465ccdada4 Mon Sep 17 00:00:00 2001 From: zengyijing Date: Thu, 4 Aug 2022 16:51:14 -0400 Subject: [PATCH 200/472] fix issue #3144 (#3226) * fix issue #3144 * add test case for verbose-wlog Co-authored-by: zengyijing --- programs/zstdcli.c | 2 ++ tests/cli-tests/compression/verbose-wlog.sh | 11 +++++++++++ .../cli-tests/compression/verbose-wlog.sh.stderr.glob | 5 +++++ .../cli-tests/compression/verbose-wlog.sh.stdout.glob | 5 +++++ 4 files changed, 23 insertions(+) create mode 100755 tests/cli-tests/compression/verbose-wlog.sh create mode 100644 tests/cli-tests/compression/verbose-wlog.sh.stderr.glob create mode 100644 tests/cli-tests/compression/verbose-wlog.sh.stdout.glob diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 379a3f83f..3e4510abc 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -1051,6 +1051,8 @@ int main(int argCount, const char* argv[]) /* Invalid character following --long */ badusage(programName); CLEAN_RETURN(1); + } else { + ldmWindowLog = g_defaultMaxWindowLog; } /* Only set windowLog if not already set by --zstd */ if (compressionParams.windowLog == 0) diff --git a/tests/cli-tests/compression/verbose-wlog.sh b/tests/cli-tests/compression/verbose-wlog.sh new file mode 100755 index 000000000..88ee11ac8 --- /dev/null +++ b/tests/cli-tests/compression/verbose-wlog.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +. "$COMMON/platform.sh" + +zstd < file -vv -19 -o file.19.zst +zstd -vv -l file.19.zst + +zstd < file -vv -19 --long -o file.19.long.zst +zstd -vv -l file.19.long.zst diff --git a/tests/cli-tests/compression/verbose-wlog.sh.stderr.glob b/tests/cli-tests/compression/verbose-wlog.sh.stderr.glob new file mode 100644 index 000000000..135347189 --- /dev/null +++ b/tests/cli-tests/compression/verbose-wlog.sh.stderr.glob @@ -0,0 +1,5 @@ +... +*wlog=23* +... +*wlog=27* +... diff --git a/tests/cli-tests/compression/verbose-wlog.sh.stdout.glob b/tests/cli-tests/compression/verbose-wlog.sh.stdout.glob new file mode 100644 index 000000000..19913a167 --- /dev/null +++ b/tests/cli-tests/compression/verbose-wlog.sh.stdout.glob @@ -0,0 +1,5 @@ +... +*Window Size: 8388608 B* +... +*Window Size: 134217728 B* +... From 03cc84fddb9747ddc63f76b6f3171cd8f66da202 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Thu, 4 Aug 2022 17:15:59 -0700 Subject: [PATCH 201/472] Add explicit --pass-through flag and default to enabled for *cat (#3223) Fixes #3211. Adds the `--[no-]pass-through` flag which enables/disables pass-through mode. * `zstdcat`, `zcat`, and `gzcat` default to `--pass-through`. Pass-through mode can be disabled by passing `--no-pass-through`. * All other binaries default to not setting pass-through mode. However, we preserve the legacy behavior of enabling pass-through mode when writing to stdout with `-f` set, unless pass-through mode is explicitly disabled with `--no-pass-through`. Adds a new test for this behavior that should codify the behavior we want. --- programs/fileio.c | 19 ++++++- programs/fileio.h | 1 + programs/fileio_types.h | 1 + programs/zstdcli.c | 17 +++++- tests/cli-tests/decompression/pass-through.sh | 57 +++++++++++++++++++ .../pass-through.sh.stderr.exact | 10 ++++ .../pass-through.sh.stdout.exact | 25 ++++++++ 7 files changed, 125 insertions(+), 5 deletions(-) create mode 100755 tests/cli-tests/decompression/pass-through.sh create mode 100644 tests/cli-tests/decompression/pass-through.sh.stderr.exact create mode 100644 tests/cli-tests/decompression/pass-through.sh.stdout.exact diff --git a/programs/fileio.c b/programs/fileio.c index 165181314..96cf602a3 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -290,6 +290,7 @@ FIO_prefs_t* FIO_createPreferences(void) ret->excludeCompressedFiles = 0; ret->allowBlockDevices = 0; ret->asyncIO = AIO_supported(); + ret->passThrough = -1; return ret; } @@ -463,6 +464,10 @@ void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, int value) { #endif } +void FIO_setPassThroughFlag(FIO_prefs_t* const prefs, int value) { + prefs->passThrough = (value != 0); +} + /* FIO_ctx_t functions */ void FIO_setHasStdoutOutput(FIO_ctx_t* const fCtx, int value) { @@ -2336,6 +2341,16 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, { unsigned readSomething = 0; unsigned long long filesize = 0; + int passThrough = prefs->passThrough; + + if (passThrough == -1) { + /* If pass-through mode is not explicitly enabled or disabled, + * default to the legacy behavior of enabling it if we are writing + * to stdout with the overwrite flag enabled. + */ + passThrough = prefs->overwrite && !strcmp(dstFileName, stdoutmark); + } + assert(passThrough == 0 || passThrough == 1); /* for each frame */ for ( ; ; ) { @@ -2353,7 +2368,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, } readSomething = 1; /* there is at least 1 byte in srcFile */ if (ress.readCtx->srcBufferLoaded < toRead) { /* not enough input to check magic number */ - if ((prefs->overwrite) && !strcmp (dstFileName, stdoutmark)) { /* pass-through mode */ + if (passThrough) { return FIO_passThrough(&ress); } DISPLAYLEVEL(1, "zstd: %s: unknown header \n", srcFileName); @@ -2391,7 +2406,7 @@ static int FIO_decompressFrames(FIO_ctx_t* const fCtx, DISPLAYLEVEL(1, "zstd: %s: lz4 file cannot be uncompressed (zstd compiled without HAVE_LZ4) -- ignored \n", srcFileName); return 1; #endif - } else if ((prefs->overwrite) && !strcmp (dstFileName, stdoutmark)) { /* pass-through mode */ + } else if (passThrough) { return FIO_passThrough(&ress); } else { DISPLAYLEVEL(1, "zstd: %s: unsupported format \n", srcFileName); diff --git a/programs/fileio.h b/programs/fileio.h index f614aa04e..b848934bc 100644 --- a/programs/fileio.h +++ b/programs/fileio.h @@ -105,6 +105,7 @@ void FIO_setPatchFromMode(FIO_prefs_t* const prefs, int value); void FIO_setContentSize(FIO_prefs_t* const prefs, int value); void FIO_displayCompressionParameters(const FIO_prefs_t* prefs); void FIO_setAsyncIOFlag(FIO_prefs_t* const prefs, int value); +void FIO_setPassThroughFlag(FIO_prefs_t* const prefs, int value); /* FIO_ctx_t functions */ void FIO_setNbFilesTotal(FIO_ctx_t* const fCtx, int value); diff --git a/programs/fileio_types.h b/programs/fileio_types.h index c47adb3ac..a1fac2ca7 100644 --- a/programs/fileio_types.h +++ b/programs/fileio_types.h @@ -68,6 +68,7 @@ typedef struct FIO_prefs_s { int patchFromMode; int contentSize; int allowBlockDevices; + int passThrough; } FIO_prefs_t; #endif /* FILEIO_TYPES_HEADER */ diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 3e4510abc..47ef388fe 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -264,6 +264,15 @@ static void usage_advanced(const char* programName) # else DISPLAYOUT(" --[no-]sparse sparse mode (default: disabled)\n"); # endif + { + char const* passThroughDefault = "disabled"; + if (exeNameMatch(programName, ZSTD_CAT) || + exeNameMatch(programName, ZSTD_ZCAT) || + exeNameMatch(programName, ZSTD_GZCAT)) { + passThroughDefault = "enabled"; + } + DISPLAYOUT(" --[no-]pass-through : passes through uncompressed files as-is (default: %s\n)", passThroughDefault); + } #endif /* ZSTD_NODECOMPRESS */ #ifndef ZSTD_NODICT @@ -870,14 +879,14 @@ int main(int argCount, const char* argv[]) /* preset behaviors */ if (exeNameMatch(programName, ZSTD_ZSTDMT)) nbWorkers=0, singleThread=0; if (exeNameMatch(programName, ZSTD_UNZSTD)) operation=zom_decompress; - if (exeNameMatch(programName, ZSTD_CAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; outFileName=stdoutmark; g_displayLevel=1; } /* supports multiple formats */ - if (exeNameMatch(programName, ZSTD_ZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; outFileName=stdoutmark; g_displayLevel=1; } /* behave like zcat, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_CAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; FIO_setPassThroughFlag(prefs, 1); outFileName=stdoutmark; g_displayLevel=1; } /* supports multiple formats */ + if (exeNameMatch(programName, ZSTD_ZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; FIO_setPassThroughFlag(prefs, 1); outFileName=stdoutmark; g_displayLevel=1; } /* behave like zcat, also supports multiple formats */ if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ suffix = GZ_EXTENSION; FIO_setCompressionType(prefs, FIO_gzipCompression); FIO_setRemoveSrcFile(prefs, 1); dictCLevel = cLevel = 6; /* gzip default is -6 */ } if (exeNameMatch(programName, ZSTD_GUNZIP)) { operation=zom_decompress; FIO_setRemoveSrcFile(prefs, 1); } /* behave like gunzip, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_GZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; outFileName=stdoutmark; g_displayLevel=1; } /* behave like gzcat, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_GZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; FIO_setPassThroughFlag(prefs, 1); outFileName=stdoutmark; g_displayLevel=1; } /* behave like gzcat, also supports multiple formats */ if (exeNameMatch(programName, ZSTD_LZMA)) { suffix = LZMA_EXTENSION; FIO_setCompressionType(prefs, FIO_lzmaCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like lzma */ if (exeNameMatch(programName, ZSTD_UNLZMA)) { operation=zom_decompress; FIO_setCompressionType(prefs, FIO_lzmaCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like unlzma, also supports multiple formats */ if (exeNameMatch(programName, ZSTD_XZ)) { suffix = XZ_EXTENSION; FIO_setCompressionType(prefs, FIO_xzCompression); FIO_setRemoveSrcFile(prefs, 1); } /* behave like xz */ @@ -926,6 +935,8 @@ int main(int argCount, const char* argv[]) if (!strcmp(argument, "--no-check")) { FIO_setChecksumFlag(prefs, 0); continue; } if (!strcmp(argument, "--sparse")) { FIO_setSparseWrite(prefs, 2); continue; } if (!strcmp(argument, "--no-sparse")) { FIO_setSparseWrite(prefs, 0); continue; } + if (!strcmp(argument, "--pass-through")) { FIO_setPassThroughFlag(prefs, 1); continue; } + if (!strcmp(argument, "--no-pass-through")) { FIO_setPassThroughFlag(prefs, 0); continue; } if (!strcmp(argument, "--test")) { operation=zom_test; continue; } if (!strcmp(argument, "--asyncio")) { FIO_setAsyncIOFlag(prefs, 1); continue;} if (!strcmp(argument, "--no-asyncio")) { FIO_setAsyncIOFlag(prefs, 0); continue;} diff --git a/tests/cli-tests/decompression/pass-through.sh b/tests/cli-tests/decompression/pass-through.sh new file mode 100755 index 000000000..2cab463f8 --- /dev/null +++ b/tests/cli-tests/decompression/pass-through.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +set -e + +. "$COMMON/platform.sh" + +echo "" > 1 +echo "2" > 2 +echo "23" > 3 +echo "234" > 4 +echo "some data" > file + +println "+ passthrough enabled" + +zstd file + +# Test short files +zstd -dc --pass-through 1 2 3 4 + +# Test *cat symlinks +zstdcat file +"$ZSTD_SYMLINK_DIR/zcat" file +"$ZSTD_SYMLINK_DIR/gzcat" file + +# Test multiple files with mix of compressed & not +zstdcat file file.zst +zstdcat file.zst file + +# Test --pass-through +zstd -dc --pass-through file +zstd -d --pass-through file -o pass-through-file + +# Test legacy implicit passthrough with -fc +zstd -dcf file +zstd -dcf file file.zst +zstd -df < file +zstd -dcf < file file.zst - +zstd -dcf < file.zst file - + +$DIFF file pass-through-file + +println "+ passthrough disabled" + +# Test *cat +zstdcat --no-pass-through file && die "should fail" +"$ZSTD_SYMLINK_DIR/zcat" --no-pass-through file && die "should fail" +"$ZSTD_SYMLINK_DIR/gzcat" --no-pass-through file && die "should fail" +# Test zstd without implicit passthrough +zstd -d file -o no-pass-through-file && die "should fail" +zstd -d < file && die "should fail" + +# Test legacy implicit passthrough with -fc +zstd --no-pass-through -dcf file && die "should fail" +zstd --no-pass-through -dcf file file.zst && die "should fail" +zstd --no-pass-through -df < file && die "should fail" +zstd --no-pass-through -dcf < file file.zst - && die "should fail" +zstd --no-pass-through -dcf < file.zst file - && die "should fail" ||: diff --git a/tests/cli-tests/decompression/pass-through.sh.stderr.exact b/tests/cli-tests/decompression/pass-through.sh.stderr.exact new file mode 100644 index 000000000..f9ac13cb2 --- /dev/null +++ b/tests/cli-tests/decompression/pass-through.sh.stderr.exact @@ -0,0 +1,10 @@ +zstd: file: unsupported format +zstd: file: unsupported format +zstd: file: unsupported format +zstd: file: unsupported format +zstd: /*stdin*\: unsupported format +zstd: file: unsupported format +zstd: file: unsupported format +zstd: /*stdin*\: unsupported format +zstd: /*stdin*\: unsupported format +zstd: file: unsupported format diff --git a/tests/cli-tests/decompression/pass-through.sh.stdout.exact b/tests/cli-tests/decompression/pass-through.sh.stdout.exact new file mode 100644 index 000000000..b0d494c14 --- /dev/null +++ b/tests/cli-tests/decompression/pass-through.sh.stdout.exact @@ -0,0 +1,25 @@ ++ passthrough enabled + +2 +23 +234 +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data +some data ++ passthrough disabled +some data +some data +some data From 3f7a1b13285aa3bcd5b733dd804dbc81a45fa77d Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Fri, 5 Aug 2022 17:09:22 +0200 Subject: [PATCH 202/472] added a few documentation words about dictionary training partially answering questions such as #3233 which looks for guidance within `exmaples/`. --- examples/common.h | 30 +++++++++++++++++++++--------- examples/dictionary_compression.c | 14 ++++++++++++-- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/examples/common.h b/examples/common.h index 5f45b3406..9b09030eb 100644 --- a/examples/common.h +++ b/examples/common.h @@ -21,6 +21,17 @@ #include // stat #include + +/* UNUSED_ATTR tells the compiler it is okay if the function is unused. */ +#if defined(__GNUC__) +# define UNUSED_ATTR __attribute__((unused)) +#else +# define UNUSED_ATTR +#endif + +#define HEADER_FUNCTION static UNUSED_ATTR + + /* * Define the returned error code from utility functions. */ @@ -68,7 +79,7 @@ typedef enum { * * @return The size of a given file path. */ -static size_t fsize_orDie(const char *filename) +HEADER_FUNCTION size_t fsize_orDie(const char *filename) { struct stat st; if (stat(filename, &st) != 0) { @@ -96,7 +107,7 @@ static size_t fsize_orDie(const char *filename) * @return If successful this function will return a FILE pointer to an * opened file otherwise it sends an error to stderr and exits. */ -static FILE* fopen_orDie(const char *filename, const char *instruction) +HEADER_FUNCTION FILE* fopen_orDie(const char *filename, const char *instruction) { FILE* const inFile = fopen(filename, instruction); if (inFile) return inFile; @@ -108,7 +119,7 @@ static FILE* fopen_orDie(const char *filename, const char *instruction) /*! fclose_orDie() : * Close an opened file using given FILE pointer. */ -static void fclose_orDie(FILE* file) +HEADER_FUNCTION void fclose_orDie(FILE* file) { if (!fclose(file)) { return; }; /* error */ @@ -123,7 +134,7 @@ static void fclose_orDie(FILE* file) * * @return The number of bytes read. */ -static size_t fread_orDie(void* buffer, size_t sizeToRead, FILE* file) +HEADER_FUNCTION size_t fread_orDie(void* buffer, size_t sizeToRead, FILE* file) { size_t const readSize = fread(buffer, 1, sizeToRead, file); if (readSize == sizeToRead) return readSize; /* good */ @@ -143,7 +154,7 @@ static size_t fread_orDie(void* buffer, size_t sizeToRead, FILE* file) * * @return The number of bytes written. */ -static size_t fwrite_orDie(const void* buffer, size_t sizeToWrite, FILE* file) +HEADER_FUNCTION size_t fwrite_orDie(const void* buffer, size_t sizeToWrite, FILE* file) { size_t const writtenSize = fwrite(buffer, 1, sizeToWrite, file); if (writtenSize == sizeToWrite) return sizeToWrite; /* good */ @@ -159,7 +170,7 @@ static size_t fwrite_orDie(const void* buffer, size_t sizeToWrite, FILE* file) * cated memory. If there is an error, this function will send that * error to stderr and exit. */ -static void* malloc_orDie(size_t size) +HEADER_FUNCTION void* malloc_orDie(size_t size) { void* const buff = malloc(size); if (buff) return buff; @@ -177,7 +188,7 @@ static void* malloc_orDie(size_t size) * @return If successful this function will load file into buffer and * return file size, otherwise it will printout an error to stderr and exit. */ -static size_t loadFile_orDie(const char* fileName, void* buffer, size_t bufferSize) +HEADER_FUNCTION size_t loadFile_orDie(const char* fileName, void* buffer, size_t bufferSize) { size_t const fileSize = fsize_orDie(fileName); CHECK(fileSize <= bufferSize, "File too large!"); @@ -201,7 +212,8 @@ static size_t loadFile_orDie(const char* fileName, void* buffer, size_t bufferSi * @return If successful this function will return buffer and bufferSize(=fileSize), * otherwise it will printout an error to stderr and exit. */ -static void* mallocAndLoadFile_orDie(const char* fileName, size_t* bufferSize) { +HEADER_FUNCTION void* mallocAndLoadFile_orDie(const char* fileName, size_t* bufferSize) +{ size_t const fileSize = fsize_orDie(fileName); *bufferSize = fileSize; void* const buffer = malloc_orDie(*bufferSize); @@ -217,7 +229,7 @@ static void* mallocAndLoadFile_orDie(const char* fileName, size_t* bufferSize) { * Note: This function will send an error to stderr and exit if it * cannot write to a given file. */ -static void saveFile_orDie(const char* fileName, const void* buff, size_t buffSize) +HEADER_FUNCTION void saveFile_orDie(const char* fileName, const void* buff, size_t buffSize) { FILE* const oFile = fopen_orDie(fileName, "wb"); size_t const wSize = fwrite(buff, 1, buffSize, oFile); diff --git a/examples/dictionary_compression.c b/examples/dictionary_compression.c index 0eee6508e..7c7d34288 100644 --- a/examples/dictionary_compression.c +++ b/examples/dictionary_compression.c @@ -6,7 +6,17 @@ * LICENSE file in the root directory of this source tree) and the GPLv2 (found * in the COPYING file in the root directory of this source tree). * You may select, at your option, one of the above-listed licenses. - */ +**/ + +/* This example deals with Dictionary compression, + * its counterpart is `examples/dictionary_decompression.c` . + * These examples presume that a dictionary already exists. + * The main method to create a dictionary is `zstd --train`, + * look at the CLI documentation for details. + * Another possible method is to employ dictionary training API, + * published in `lib/zdict.h` . +**/ + #include // printf #include // free #include // memset, strcat @@ -14,7 +24,7 @@ #include "common.h" // Helper functions, CHECK(), and CHECK_ZSTD() /* createDict() : - `dictFileName` is supposed to have been created using `zstd --train` */ +** `dictFileName` is supposed already created using `zstd --train` */ static ZSTD_CDict* createCDict_orDie(const char* dictFileName, int cLevel) { size_t dictSize; From 1c847e2e32f3c2203a9b81b6081b53f9275ec438 Mon Sep 17 00:00:00 2001 From: Konstantin Gribov Date: Mon, 1 Aug 2022 23:50:54 +0300 Subject: [PATCH 203/472] Add description for ZSTD_decompressStream and ZSTD_initDStream With that these functions become visible in generated docs. Fixes #3229 --- lib/zstd.h | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/zstd.h b/lib/zstd.h index 07586c24c..41d5f6dca 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -823,13 +823,31 @@ ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer /*===== Streaming decompression functions =====*/ -/* This function is redundant with the advanced API and equivalent to: +/*! ZSTD_initDStream() : + * Initialize/reset DStream state for new decompression operation. + * Call before new decompression operation using same DStream. * + * Note : This function is redundant with the advanced API and equivalent to: * ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); * ZSTD_DCtx_refDDict(zds, NULL); */ ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds); +/*! ZSTD_decompressStream() : + * Streaming decompression function. + * Call repetitively to consume full input updating it as necessary. + * Funtion will update both input and output `pos` fields exposing current state via these fields: + * - `input.pos < input.size`, some input remaining and caller should provide remaining input + * on the next call. + * - `output.pos < output.size`, decoder finished and flushed all remaining buffers. + * - `output.pos == output.size`, potentially uncflushed data present in the internal buffers, + * call ZSTD_decompressStream() again to flush remaining data to output. + * Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX. + * + * @return : 0 when a frame is completly decoded and fully flushed, + * or an error code, which can be tested using ZSTD_isError(), + * or any other value > 0, which means there is some decoding or flushing to do to complete current frame. + */ ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input); ZSTDLIB_API size_t ZSTD_DStreamInSize(void); /*!< recommended size for input buffer */ From cca35447086a7c48e5ff15a7948ea4711ef87914 Mon Sep 17 00:00:00 2001 From: William Ahern Date: Wed, 10 Aug 2022 16:51:17 -0700 Subject: [PATCH 204/472] restore combine.sh bash performance while still sticking to POSIX --- build/single_file_libs/combine.sh | 43 ++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/build/single_file_libs/combine.sh b/build/single_file_libs/combine.sh index a4933bf21..515bf18c6 100755 --- a/build/single_file_libs/combine.sh +++ b/build/single_file_libs/combine.sh @@ -2,11 +2,7 @@ # Tool to bundle multiple C/C++ source files, inlining any includes. # -# Note: this POSIX-compliant script is many times slower than the original bash -# implementation (due to the grep calls) but it runs and works everywhere. -# # TODO: ROOTS, FOUND, etc., as arrays (since they fail on paths with spaces) -# TODO: revert to Bash-only regex (the grep ones being too slow) # # Author: Carl Woffenden, Numfum GmbH (this script is released under a CC0 license/Public Domain) @@ -52,13 +48,36 @@ test_deps() { fi } -# Tests if list $1 has item $2 (returning zero on a match) -list_has_item() { - if echo "$1" | grep -Eq "(^|\s*)$2(\$|\s*)"; then +# Test if glob pattern $1 matches subject $2 (see fnmatch(3)) +fnmatch() { + case "$2" in + $1) return 0 - else - return 1 - fi + ;; + esac + return 1 +} + +# Test if line $1 is local include directive +is_include_line() { + fnmatch "*#*include*" "$1" || return 1 + printf "%s\n" "$1" | grep -Eq '^\s*#\s*include\s*".+"' +} + +# Test if line $1 is pragma once directive +is_pragma_once_line() { + fnmatch "*#*pragma*once*" "$1" || return 1 + printf "%s\n" "$1" | grep -Eq '^\s*#\s*pragma\s*once\s*' +} + +# Tests if list $1 has item $2 (returning zero on a match) +# (originally used grep -Eq "(^|\s*)$2(\$|\s*)) +readonly list_FS="$IFS" +list_has_item() { + for item_P in "*[$list_FS]$2[$list_FS]*" "*[$list_FS]$2" "$2[$list_FS]*" "$2"; do + fnmatch "${item_P}" "$1" && return 0 + done + return 1 } # Adds a new line with the supplied arguments to $DESTN (or stdout) @@ -124,7 +143,7 @@ add_file() { # Read the file local line= while IFS= read -r line; do - if echo "$line" | grep -Eq '^\s*#\s*include\s*".+"'; then + if is_include_line "$line"; then # We have an include directive so strip the (first) file local inc=$(echo "$line" | grep -Eo '".*"' | sed -E 's/"([^"]+)"/\1/' | head -1) local res_inc="$(resolve_include "$srcdir" "$inc")" @@ -155,7 +174,7 @@ add_file() { # Skip any 'pragma once' directives, otherwise write the source line local write=$PONCE if [ $write -eq 0 ]; then - if echo "$line" | grep -Eqv '^\s*#\s*pragma\s*once\s*'; then + if ! is_pragma_once_line "$line"; then write=1 fi fi From 60fcc36af6122610122bb4f34a606c1939603e5b Mon Sep 17 00:00:00 2001 From: William Ahern Date: Wed, 10 Aug 2022 20:58:55 -0700 Subject: [PATCH 205/472] escape glob pattern special characters in subject string before generating search patterns in combine.sh list_has_item --- build/single_file_libs/combine.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/build/single_file_libs/combine.sh b/build/single_file_libs/combine.sh index 515bf18c6..222c2c32a 100755 --- a/build/single_file_libs/combine.sh +++ b/build/single_file_libs/combine.sh @@ -74,6 +74,24 @@ is_pragma_once_line() { # (originally used grep -Eq "(^|\s*)$2(\$|\s*)) readonly list_FS="$IFS" list_has_item() { + # Re: escaping glob pattern special characters in item string: + # + # bash (tested 3.2.57, 5.1.4), dash (tested 0.5.10.2), NetBSD /bin/sh + # (tested 8.2), and Solaris /bin/sh (tested 11.4) require escaping + # backslashes in a bracket expression despite POSIX specifying that + # backslash loses significance in a bracket expression. + # + # Conversely, neither FreeBSD /bin/sh (tested 12.2) nor OpenBSD /bin/sh + # (tested 7.1) obey backslash-escaping in case statement patterns even + # outside bracket expressions, so escape special characters using bracket + # expressions. + # + # Solaris /bin/sh (tested 11.4) requires vertical bar (|) to be escaped. + # + # All accommodations should behave as expected under strict POSIX semantics. + if fnmatch "*[\\*?[|]*" "$2"; then + set -- "$1" "$(printf '%s\n' "$2" | sed -e 's/[*?[|]/[&]/g; s/[\]/[\\&]/g')" + fi for item_P in "*[$list_FS]$2[$list_FS]*" "*[$list_FS]$2" "$2[$list_FS]*" "$2"; do fnmatch "${item_P}" "$1" && return 0 done From 3b4e47092ea3e6c6d36b5e71d1f930ace4870e51 Mon Sep 17 00:00:00 2001 From: Chris Burgess <9002722+cgbur@users.noreply.github.com> Date: Mon, 15 Aug 2022 13:29:54 -0400 Subject: [PATCH 206/472] Document pass-through behavior (#3242) Adds documentation to help and man pages for legacy pass-through behavior when force is set and destination is stdout. Documents --pass-through in man pages --- programs/zstd.1 | 7 +++++-- programs/zstd.1.md | 8 ++++++++ programs/zstdcli.c | 5 +++-- programs/zstdgrep.1 | 13 +++++++++++-- programs/zstdless.1 | 9 +++++++-- tests/cli-tests/basic/help.sh.stdout.glob | 3 ++- 6 files changed, 36 insertions(+), 9 deletions(-) diff --git a/programs/zstd.1 b/programs/zstd.1 index 3ac7f0f3c..a2bf7fd2f 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -1,5 +1,5 @@ . -.TH "ZSTD" "1" "June 2022" "zstd 1.5.3" "User Commands" +.TH "ZSTD" "1" "August 2022" "zstd 1.5.3" "User Commands" . .SH "NAME" \fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files @@ -162,7 +162,7 @@ Additionally, this can be used to limit memory for dictionary training\. This pa \fB\-o FILE\fR: save result into \fBFILE\fR . .IP "\(bu" 4 -\fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\. +\fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\. During decompression and when the output destination is stdout, pass\-through unrecognized formats as\-is\. . .IP "\(bu" 4 \fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console); keep original files unchanged\. @@ -171,6 +171,9 @@ Additionally, this can be used to limit memory for dictionary training\. This pa \fB\-\-[no\-]sparse\fR: enable / disable sparse FS support, to make files with many zeroes smaller on disk\. Creating sparse files may save disk space and speed up decompression by reducing the amount of disk I/O\. default: enabled when output is into a file, and disabled when output is stdout\. This setting overrides default and can force sparse mode over stdout\. . .IP "\(bu" 4 +\fB\-\-[no\-]pass\-through\fR enable / disable passing through uncompressed files as\-is\. During decompression when pass\-through is enabled, unrecognized formats will be copied as\-is from the input to the output\. By default, pass\-through will occur when the output destination is stdout and the force (\-f) option is set\. +. +.IP "\(bu" 4 \fB\-\-rm\fR: remove source file(s) after successful compression or decompression\. If used in combination with \-o, will trigger a confirmation prompt (which can be silenced with \-f), as this is a destructive operation\. . .IP "\(bu" 4 diff --git a/programs/zstd.1.md b/programs/zstd.1.md index af18586ab..3ab8404ee 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -211,6 +211,8 @@ the last one takes effect. * `-f`, `--force`: disable input and output checks. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc. + During decompression and when the output destination is stdout, pass-through + unrecognized formats as-is. * `-c`, `--stdout`: write to standard output (even if it is the console); keep original files unchanged. * `--[no-]sparse`: @@ -221,6 +223,12 @@ the last one takes effect. default: enabled when output is into a file, and disabled when output is stdout. This setting overrides default and can force sparse mode over stdout. +* `--[no-]pass-through` + enable / disable passing through uncompressed files as-is. During + decompression when pass-through is enabled, unrecognized formats will be + copied as-is from the input to the output. By default, pass-through will + occur when the output destination is stdout and the force (-f) option is + set. * `--rm`: remove source file(s) after successful compression or decompression. If used in combination with -o, will trigger a confirmation prompt (which can be silenced with -f), as this is a destructive operation. diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 47ef388fe..e93d19206 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -154,7 +154,8 @@ static void usage(FILE* f, const char* programName) #endif DISPLAY_F(f, " -f, --force disable input and output checks. Allows overwriting existing files,\n"); DISPLAY_F(f, " input from console, output to stdout, operating on links,\n"); - DISPLAY_F(f, " block devices, etc.\n"); + DISPLAY_F(f, " block devices, etc. During decompression and when the output\n"); + DISPLAY_F(f, " destination is stdout, pass-through unrecognized formats as-is.\n"); DISPLAY_F(f, " --rm remove source file(s) after successful de/compression\n"); DISPLAY_F(f, " -k, --keep preserve source file(s) (default) \n"); #ifdef ZSTD_GZCOMPRESS @@ -271,7 +272,7 @@ static void usage_advanced(const char* programName) exeNameMatch(programName, ZSTD_GZCAT)) { passThroughDefault = "enabled"; } - DISPLAYOUT(" --[no-]pass-through : passes through uncompressed files as-is (default: %s\n)", passThroughDefault); + DISPLAYOUT(" --[no-]pass-through : passes through uncompressed files as-is (default: %s)\n", passThroughDefault); } #endif /* ZSTD_NODECOMPRESS */ diff --git a/programs/zstdgrep.1 b/programs/zstdgrep.1 index 4ece2ae50..8c7cf5eda 100644 --- a/programs/zstdgrep.1 +++ b/programs/zstdgrep.1 @@ -1,17 +1,26 @@ -.TH "ZSTDGREP" "1" "April 2022" "zstd 1.5.2" "User Commands" +. +.TH "ZSTDGREP" "1" "August 2022" "zstd 1.5.3" "User Commands" +. .SH "NAME" \fBzstdgrep\fR \- print lines matching a pattern in zstandard\-compressed files +. .SH "SYNOPSIS" -\fBzstdgrep\fR [\fIgrep\-flags\fR] [\-\-] \fIpattern\fR [\fIfiles\fR \|\.\|\.\|\.] +\fBzstdgrep\fR [\fIgrep\-flags\fR] [\-\-] \fIpattern\fR [\fIfiles\fR \.\.\.] +. .SH "DESCRIPTION" \fBzstdgrep\fR runs \fBgrep (1)\fR on files, or \fBstdin\fR if no files argument is given, after decompressing them with \fBzstdcat (1)\fR\. +. .P The grep\-flags and pattern arguments are passed on to \fBgrep (1)\fR\. If an \fB\-e\fR flag is found in the \fBgrep\-flags\fR, \fBzstdgrep\fR will not look for a pattern argument\. +. .P Note that modern \fBgrep\fR alternatives such as \fBripgrep\fR (\fBrg\fR) support \fBzstd\fR\-compressed files out of the box, and can prove better alternatives than \fBzstdgrep\fR notably for unsupported complex pattern searches\. Note though that such alternatives may also feature some minor command line differences\. +. .SH "EXIT STATUS" In case of missing arguments or missing pattern, 1 will be returned, otherwise 0\. +. .SH "SEE ALSO" \fBzstd (1)\fR +. .SH "AUTHORS" Thomas Klausner \fIwiz@NetBSD\.org\fR diff --git a/programs/zstdless.1 b/programs/zstdless.1 index 36f21494d..a1414946e 100644 --- a/programs/zstdless.1 +++ b/programs/zstdless.1 @@ -1,9 +1,14 @@ -.TH "ZSTDLESS" "1" "April 2022" "zstd 1.5.2" "User Commands" +. +.TH "ZSTDLESS" "1" "August 2022" "zstd 1.5.3" "User Commands" +. .SH "NAME" \fBzstdless\fR \- view zstandard\-compressed files +. .SH "SYNOPSIS" -\fBzstdless\fR [\fIflags\fR] [\fIfile\fR \|\.\|\.\|\.] +\fBzstdless\fR [\fIflags\fR] [\fIfile\fR \.\.\.] +. .SH "DESCRIPTION" \fBzstdless\fR runs \fBless (1)\fR on files or stdin, if no files argument is given, after decompressing them with \fBzstdcat (1)\fR\. +. .SH "SEE ALSO" \fBzstd (1)\fR diff --git a/tests/cli-tests/basic/help.sh.stdout.glob b/tests/cli-tests/basic/help.sh.stdout.glob index be3f15400..bfb0f7753 100644 --- a/tests/cli-tests/basic/help.sh.stdout.glob +++ b/tests/cli-tests/basic/help.sh.stdout.glob @@ -7,7 +7,8 @@ Compress or uncompress FILEs (with no FILE or when FILE is `-`, read from standa -d, --decompress decompression -f, --force disable input and output checks. Allows overwriting existing files, input from console, output to stdout, operating on links, - block devices, etc. + block devices, etc. During decompression and when the output + destination is stdout, pass-through unrecognized formats as-is. --rm remove source file(s) after successful de/compression -k, --keep preserve source file(s) (default) -D DICT use DICT as Dictionary for compression or decompression From ae5f273a92cdb8c95dde0167690c266dfbbfd2b2 Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Fri, 19 Aug 2022 12:00:32 +0200 Subject: [PATCH 207/472] drop -E flag in sed --- lib/Makefile | 2 +- lib/libzstd.mk | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Makefile b/lib/Makefile index ef202183d..74c6f1baf 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -298,7 +298,7 @@ INSTALL_DATA ?= $(INSTALL) -m 644 libzstd.pc: libzstd.pc.in @echo creating pkgconfig - @sed $(SED_ERE_OPT) \ + @sed \ -e 's|@PREFIX@|$(PREFIX)|' \ -e 's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \ -e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \ diff --git a/lib/libzstd.mk b/lib/libzstd.mk index df298d789..e39a169e4 100644 --- a/lib/libzstd.mk +++ b/lib/libzstd.mk @@ -124,7 +124,6 @@ ifeq ($HAVE_COLORNEVER, 1) GREP_OPTIONS += --color=never endif GREP = grep $(GREP_OPTIONS) -SED_ERE_OPT ?= -E ZSTD_COMMON_FILES := $(sort $(wildcard $(LIBZSTD)/common/*.c)) ZSTD_COMPRESS_FILES := $(sort $(wildcard $(LIBZSTD)/compress/*.c)) From efef80b75e3029d4c7fcd681dd86a6e9a1c45477 Mon Sep 17 00:00:00 2001 From: Harmen Stoppels Date: Fri, 19 Aug 2022 12:06:43 +0200 Subject: [PATCH 208/472] Fix make variable --- Makefile | 2 +- lib/libzstd.mk | 2 +- programs/Makefile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 67ef928cc..429c90ff1 100644 --- a/Makefile +++ b/Makefile @@ -157,7 +157,7 @@ MKDIR ?= mkdir -p HAVE_COLORNEVER = $(shell echo a | egrep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) EGREP_OPTIONS ?= -ifeq ($HAVE_COLORNEVER, 1) +ifeq ($(HAVE_COLORNEVER), 1) EGREP_OPTIONS += --color=never endif EGREP = egrep $(EGREP_OPTIONS) diff --git a/lib/libzstd.mk b/lib/libzstd.mk index df298d789..f9cfa6f2b 100644 --- a/lib/libzstd.mk +++ b/lib/libzstd.mk @@ -120,7 +120,7 @@ endif HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) GREP_OPTIONS ?= -ifeq ($HAVE_COLORNEVER, 1) +ifeq ($(HAVE_COLORNEVER), 1) GREP_OPTIONS += --color=never endif GREP = grep $(GREP_OPTIONS) diff --git a/programs/Makefile b/programs/Makefile index a5f5b45f2..fb830ab19 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -339,7 +339,7 @@ ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD D HAVE_COLORNEVER = $(shell echo a | egrep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0) EGREP_OPTIONS ?= -ifeq ($HAVE_COLORNEVER, 1) +ifeq ($(HAVE_COLORNEVER), 1) EGREP_OPTIONS += --color=never endif EGREP = egrep $(EGREP_OPTIONS) From a0b09d0ff735d34fd99029bb59ffff2874565b42 Mon Sep 17 00:00:00 2001 From: Andrea Pappacoda Date: Sun, 28 Aug 2022 13:01:20 +0200 Subject: [PATCH 209/472] build(cmake): improve pkg-config generation With this patch the pkg-config generation when using the CMake build system is improved in the following ways: - Libs.private is now filled when needed - The JoinPaths module is now used to join paths, leading to simpler code - The .pc file is always generated, regardless of the platform, as it can also be consumed on Windows Here's how the .pc file is affected by these changes, in comparison to the one generated with the official Makefiles: $ diff -s lib/libzstd.pc build/cmake/build-old/lib/libzstd.pc 15c15 < Libs.private: -pthread --- > Libs.private: $ diff -s lib/libzstd.pc build/cmake/build-new/lib/libzstd.pc Files lib/libzstd.pc and build/cmake/build-new/lib/libzstd.pc are identical --- build/cmake/CMakeModules/JoinPaths.cmake | 23 +++++++++++++++++ build/cmake/lib/CMakeLists.txt | 33 +++++++----------------- 2 files changed, 33 insertions(+), 23 deletions(-) create mode 100644 build/cmake/CMakeModules/JoinPaths.cmake diff --git a/build/cmake/CMakeModules/JoinPaths.cmake b/build/cmake/CMakeModules/JoinPaths.cmake new file mode 100644 index 000000000..c68d91b84 --- /dev/null +++ b/build/cmake/CMakeModules/JoinPaths.cmake @@ -0,0 +1,23 @@ +# This module provides function for joining paths +# known from most languages +# +# SPDX-License-Identifier: (MIT OR CC0-1.0) +# Copyright 2020 Jan Tojnar +# https://github.com/jtojnar/cmake-snips +# +# Modelled after Python’s os.path.join +# https://docs.python.org/3.7/library/os.path.html#os.path.join +# Windows not supported +function(join_paths joined_path first_path_segment) + set(temp_path "${first_path_segment}") + foreach(current_segment IN LISTS ARGN) + if(NOT ("${current_segment}" STREQUAL "")) + if(IS_ABSOLUTE "${current_segment}") + set(temp_path "${current_segment}") + else() + set(temp_path "${temp_path}/${current_segment}") + endif() + endif() + endforeach() + set(${joined_path} "${temp_path}" PARENT_SCOPE) +endfunction() diff --git a/build/cmake/lib/CMakeLists.txt b/build/cmake/lib/CMakeLists.txt index 4905bd913..cf7af0f8c 100644 --- a/build/cmake/lib/CMakeLists.txt +++ b/build/cmake/lib/CMakeLists.txt @@ -135,30 +135,17 @@ if (ZSTD_BUILD_STATIC) OUTPUT_NAME ${STATIC_LIBRARY_BASE_NAME}) endif () -if (UNIX OR MINGW) - # pkg-config - set(PREFIX "${CMAKE_INSTALL_PREFIX}") - set(EXEC_PREFIX "\${prefix}") - set(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}") - set(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}") - set(VERSION "${zstd_VERSION}") +# pkg-config +include(JoinPaths) # can be replaced by cmake_path(APPEND) in CMake 3.20 +set(PREFIX "${CMAKE_INSTALL_PREFIX}") +set(EXEC_PREFIX "\${prefix}") +join_paths(LIBDIR "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}") +join_paths(INCLUDEDIR "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") +set(LIBS_PRIVATE "${THREADS_LIBS}") +set(VERSION "${zstd_VERSION}") - string(LENGTH "${PREFIX}" PREFIX_LENGTH) - string(SUBSTRING "${LIBDIR}" 0 ${PREFIX_LENGTH} LIBDIR_PREFIX) - string(SUBSTRING "${LIBDIR}" ${PREFIX_LENGTH} -1 LIBDIR_SUFFIX) - string(SUBSTRING "${INCLUDEDIR}" 0 ${PREFIX_LENGTH} INCLUDEDIR_PREFIX) - string(SUBSTRING "${INCLUDEDIR}" ${PREFIX_LENGTH} -1 INCLUDEDIR_SUFFIX) - - if ("${INCLUDEDIR_PREFIX}" STREQUAL "${PREFIX}") - set(INCLUDEDIR "\${prefix}${INCLUDEDIR_SUFFIX}") - endif() - if ("${LIBDIR_PREFIX}" STREQUAL "${PREFIX}") - set(LIBDIR "\${exec_prefix}${LIBDIR_SUFFIX}") - endif() - - configure_file("${LIBRARY_DIR}/libzstd.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" @ONLY) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") -endif () +configure_file("${LIBRARY_DIR}/libzstd.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" @ONLY) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libzstd.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") # install target install(FILES From 69022ad886ccf2fa9498baefe860c37e37c638ea Mon Sep 17 00:00:00 2001 From: Danielle Rozenblit Date: Tue, 6 Sep 2022 14:34:55 -0700 Subject: [PATCH 210/472] null decompress buffer test and ubsan flag added --- tests/Makefile | 4 ++++ tests/zstreamtest.c | 9 +++++++++ tests/zstreamtest_ubsan | Bin 0 -> 23164116 bytes 3 files changed, 13 insertions(+) create mode 100755 tests/zstreamtest_ubsan diff --git a/tests/Makefile b/tests/Makefile index cb77b0160..088a098a6 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -183,6 +183,10 @@ zstreamtest_tsan : CFLAGS += -fsanitize=thread zstreamtest_tsan : $(ZSTREAMFILES) $(LINK.c) $(MULTITHREAD) $^ -o $@$(EXT) +zstreamtest_ubsan : CFLAGS += -fsanitize=undefined +zstreamtest_ubsan : $(ZSTREAMFILES) + $(LINK.c) $(MULTITHREAD) $^ -o $@$(EXT) + # note : broken : requires symbols unavailable from dynamic library zstreamtest-dll : $(ZSTDDIR)/common/xxhash.c # xxh symbols not exposed from dll zstreamtest-dll : $(ZSTREAM_LOCAL_FILES) diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index 3fcdd5399..d4c9823e2 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -548,6 +548,15 @@ static int basicUnitTests(U32 seed, double compressibility) { size_t const ret = ZSTD_decompressStream(zd, &outBuff, &inBuff); if (ret != 0) goto _output_error; } + inBuff.src = NULL; + inBuff.size = 0; + inBuff.pos = 0; + outBuff.dst = NULL; + outBuff.size = 0; + outBuff.pos = 0; + CHECK_Z( ZSTD_initDStream(zd) ); + CHECK_Z(ZSTD_decompressStream(zd, &outBuff, &inBuff)); + DISPLAYLEVEL(3, "OK\n"); /* _srcSize compression test */ DISPLAYLEVEL(3, "test%3i : compress_srcSize %u bytes : ", testNb++, COMPRESSIBLE_NOISE_LENGTH); diff --git a/tests/zstreamtest_ubsan b/tests/zstreamtest_ubsan new file mode 100755 index 0000000000000000000000000000000000000000..55a36fdabfe24b7beebf52e6c5d11f4c185192b6 GIT binary patch literal 23164116 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

I^nn>cWXb_$HrbNVkQb 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 z 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

8IT#o`8~^_M|DT~u+P8O$3KIjvf6vB0AOZfS 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]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Ξ&1+74G9%CaHwp8h3HCakcU$_Ji${H8P-rQ=)>gIKq20l%;DFYBFg}7 z>YNP{NI7UW$BkE|3NiHhcPp#7`V#c1ZIGOVi7!|XIL^YxOUcp${{BHCSP!u z>m+}Rs3oYP$x-=-Z~?5N_0IG1Td!V`wV>XNZ?6ud3o`-Sg}KV#1ZIG&IHC&+?OnPI z4Bb8|IiR%EdXm32g$HMmhy+jz-Qh*!a!?y8Mg_bMC;_y60n|NzY4a0#{M*y=9e>-VAD}VK zPoQBVg=HYKLR1n!27!+^5O`s+9Mp0Gwb8mkM}l{Us3g3s|MCAnXnfk&@;!fB1X%ws zP7R^Y|oWskw9j0%8GD|UFP{{uWV1R4YaR~T*Qk^P~t2xK>gKXxv|>W?WP ze@yVPJiyM_i7UD}`kR8zW@Js%-V?RI>7T|Va1F}7+=KH8PykG^J4-Tyu6}b7JH~^`A zSql#bPs=y_ZEwNjmf(TrggKxv2vGrtpTdj1OCjN>00}?P{0d||9F$GkVt#?*?bZGV z^C6nRkrn}o{pO`ep%wwsp72uV7bwy|9V-T3%d7lt1)v5ms2}rcf5U80`x&%3u@gL~ z4r+uufQ4irN` z1IiIEC;S1WXW!1RKGr!Z1;z5Ef)FZV37u1eg3=FQ;wG8|%^Pycm3y;So{1of6EPBXz_Yp7gRm^fF=__O^(i2KArDD2@8~1Kp6y@)3!hT4^HI?pw#35 zie-?3mlJ=0gh9h4t(U+ANI9jpsw|aw2==|!_`PUaZ-Bmi#qZ72w z|G+ZPpn#7`0<7=>E!P4i3DA6x1E@zX@Z#}8NX||Gx!M8L`v;W_pk=XOh20@40x#`B zqv()z0kDYhZ2rN*-#!C0JEX0n;(721lXtI<5`Tw34=6CN@;8APV6S*s!3I?AtUy(N zF2l=2@MIVy|AR)-PHBL0TZu}JZ|76jZW|R}&9AUgX+}I_ddO)EFR#t)p8L~*9P2O zd(8qhJ5?G~i>88moGtRwpj7V4;%Rw=zhwca4QhA<)M0z#c<>FgXXjhcR40p%whm;h z_?0MFHG^aG4+s7hmG@8nBgQjbIuC+Y#();Y9DKm!+iSzb-*Fw}9?*~`m;qVR0I?C;-qw)@WjbhkJ68~DRSGyEyyb6E6oh$B93<2m%H{!XZ=V+c zEhOqpg|xTZ1)%!s1VHNpQlS%M#-M-%dBKq%DsRCL>YF8V_*mwETGeG7&`frLAC$V! z`F6f>?XG3;)%@aX`G&u}mLDYjgulfatnIC-=q+U~{g4E}u=nWlk|JbKang zzj<1o=Wja!Ht&~5=ehj~(;@E40af=AE}bzd;PP9+qtiu&2yQ$P(HusUaH@DLwF-CrqCeF##f0b2f{`Q_!2U(iKU^I%DI zDkzC|gW5CTDD>z&?$U`R0-xUjHC#Xvpawt4Tj2I5$IFkPu!7dBVH}>#|9pS6;#-R zN9TMQpYk_t235nFUwu2@y!`(Ylx7%wdqEQ?&3}IIH$Mi=kafQC>8*gS95a%E+Lxme zz~9yjvv0o%$Ub{tP+3v{X6G{aTD~vY;%oT#bw70d3dmeW&*ne>`J4GcYC7M%Jczu0 z4J6Ov+5G1ZfAc1Yy}rHqES}B(|L`}vs)9P-?_WBCt5rz*5u~2Uv-!_I{^pk|An7;0 zz4=U@&Hw-LH_rwOynktlq~5dF4;qeMpn;msv!1=~(DiTMltB%a10I$>Aa7m!0*cH7 z{4EPWm2-DJ2Y5&~1*E3ijl?u&c832 zUxSRe&EN7<1zK!;08NE;BZhxEw}O@fS$^ej2Qk1EPq`{oZJsJ9l(QvXE_jF3UWT?k zkGrVkfcm^I?>_=Xmji=q=TleBuP^(-T+pyZH}Ayz@eE)`XFhxKf0qpd0|R*eeE*8+ z4Ujn{P{WAh#jM%T3=e8d3wU(%M#A(xd;aAAF3_k5M4w_}BeK3Eu)Y`-a95M#W%Wal zLl`_PfABXydI0Jzhp1TWU$7R`Q;GpK=ppmc5Ie(WAlvzJ(*uxRNIS{$8h^9#OHe-x zd^k81U0aWxPybOB* zaf`_a6TmftYwH32)>jhX zwFscjAZYrdy9K-+0h*s)e)tHALU3)9q9Wkic?GnlG{Lj;oloacL`l07R8DsO_2`X- zwhR`5MngOA`dHS0%8VJ{H8HpOTeeAn8jaH6O2ZMWTU zEE=AXh<*o&uiI1x@XOQsfI4sHtGZ-7P9$#oa9sFLgr|cSG*Jdl`EF z|9{ZRW^m|(gWd-e>K@&o@bCQb^3^-A10Jk|1PjP4kOM##gB$<~9?&QR*y7VuAt3`+ z1ho(pC}2h1&~YrK`=AW@Y<~jOOP~p5kclAIf=mQ!?wkU4EvU~5(hT=nCe#M7rtTIM zuqLP%K{*lZtnMC2c)+}vdJpUc2JF+jV&Jp`o{0vJ3_&hGe_3-Ml<4p6SHQ08!4y!6 z!_Z{~(*+GKkb6L$19<}EIZ!Zxig|$-^QS<<3akQaD(bigaX|ujx*IYp4l1EQW`WEE znFT6I1waOJyzrX>DaIjn4yf}EG8#0-1J(eYW`B9_E;uk25KQL(CKGa?DA<9oKvUiu z2u@AcPed38Dp27`9TaUKue|I=73lp12IAUR^Hv54c1yzJA^Ub^sYJET)=s=9AC;B071m{Xzrdr+p|9|HX&>GN5@HL=Y zyc-x^MD;)Z4>}N?7@PW_F^bowAaMSA1=_r^fM6Qofw~R1y(UUuwFc=XLzC8_ZWNzuEP{iY=d;7 zC0Iy$0ZE`G*uD?oWb$A#4vogR+|u&_R2Dx1HSQR2*?O!OM-aF{Y*oOeaW6Rdu{ihp zd$6sbDV_vengejzIsqK;_x3m7(&>iFS`VU zI`8d&fJ^5LTso89fdUCU5B31p;D$CX2g|$$Cx`m-F1SOw)`x$WQoQzASG`REfZ@&XBosqb7ZhZ-H zEHtb^!37FykncgGM+r!y|Ds?sK;0tPJ;-3y-E+W!3krFGm$lD9sqvTLxBUxf9b^+83@FcYZ zXkbhM(k8NkY6ssi<^a+T?&Na3E}h%K{o#B2AK=n?tPA2~3_DXG>1P8G zQ4-VvG6R1A?s*DHRSsZ>Ksu$c1P%&<98eH|Z~1|A)j_MuI9_OgT^FO01B%xOmu{#& zXifq(%)nP7LIce&Ra9X={KF3=SKAPXWu79g8_1{&=-pnwLO4N7hxi;&Gc4UPB& zTs3Da*cdGJ2E;Y*_CJ`4qn`7|rPCYg4+dOz3gXiF59(S5a0q}BBIsl!koS?tUN3>; z3nYu4OhJ2;%)puF+kS@yAa_Hj;=n=E2|AnzR2aQTXoJT%_>=-j$p#L)mnUyQV;Yyg zgQ3=AB)PlK!KJ_hu(z>BA83;mbO4zbYzjzKcMK@6L3SU2odDi(1s+}Dcv%MNCojNN zDIIGE`23jf=FOXx<+G6%loeOa3ENj6LJ};md`T#DSIk@ax@Dv=f4Y&fx7?(y)NRhMvm&RYM zINW*!nk^J?x%B`pooNuaCM-ZS0zjn}xXS5-Rymy^pt>70F|X;O;_#xR6;w%s#6U|k zLDSQqN*&a*1?z%VRNyq~@Ur|mDCUms55SYzJ~x591ukAOGMg7z|GoVTxO}z^tQkwp z&w2uDDNTj9dv1W*Jt0k?U3H&8t?Y(1kkLTsR?jSu45;%D8nWehIqwXpmIcp2O+Z!X zh^jChtPs3NX8}|p#|v4g8jhESU}^9sa|T?w?R_IC46t}Z08(ZgfTjuTlT8nsA-Z$G zBbcD_9#$`d3cU4@BH{rKBS2ewI9|-dYef7rP*8xEaW&xbf(|Y(aDz2}+dl!9&QA>x z=VKI@`(b$yTw;O>bZo`_V`vh< zqZwq3OQQiq;{!Z-1cq<=sP|jIv!jOI4|dcTRzA3Gb{wD07YXbWKknzj^kx5$Y78#c)Yh8BKPvrMToIW zK#_pD0P{IG&_QCLiVqaX0xy|wf|WDOhA3A6^)NVI?1icX&$@HGbhrcZC%8~jKvkGh z3kszW$n-qNOFqz`OgChY=l+D{>lt1Y*FXOM^3YAt(A5?d&=kr329R(JNH_;#cLElt z+CUwU04k)wO;CZCsW<-rN1NUdya{p`xTr}$4#%@Kps<04BdEIq>ir-qxC4$Ar~=LB z|Nrm20Xk7e5PqV}3($!-VKtCp9R@55BWHn=8#FM%M{zm4+EgCHHucaX zfUMpgs{Q~L^@&*2zc~+1g$@frsSq;R02(9(l}eyNQ&2erN|?}flJXcSAJnJ-%~pUl zKo>T?Y&(Zzt9*SGcrZf&OS(H!gXDQ=y5qP8cH99h%BNycKH(}@`2#G<)37KHy$VXg z@AfA^GZv&*2J$V(3p1#CutT7EQ4CUqF+hz6FYpz3!2?qX$}a*hldeMJYZ2C><6bo= zdtekD!e=1562Oa+r$FXPp=CG7LD1k|fT0@{?4Y(CD4t&aIt?+!0cr|3ZaUFx0`OQ- zjEcjHAaHU6abd+6SOatkHLR9-x$87IR285p1T=gON+BS%pcDdf0q8zQkPDEU`n3w( zqhO8D2^G+c9Y`biPDhZ=muY9fwm3lJ0$LibuYx2BXbcF#nwi)Gw-Limu+bq94;+Ac z0Aw!~2fJWs1}Q{1PzPel1MF1-8-{MM)lW}>k{Gy@EI`%>3OrCCf~)`qB1kc$Zs{#Y z4>zz{=#T>_+(2qyemn(<>ISH%z=}E{;}S3fkzymgk|MG)Fa1T!1+mWIK5Ihro->QmCWBT0z540xz3ygHqZn(25NP zTrFC|Qc&<<>Ah&cG(X!ffJ^h25*(Uu-GbYkfJ^gsT$<~kqcjZQW+tdk2X!4FvAGGH zyg*{0@gdM+B8QiP&;)P*%L0)mEb1SC9S6>U4$zQNkU#{l_Y-(I3+j-B^`Jx| zqw>N8Y?_S9OTOKpGzUH}r~xMVycnceM&;%GT_DMO`xn4u{(|F1M&;#3s7wPEm)-y? zLiJe^)Bz8`T~qKUerRBLMF6d z#)2JxZ~p^SRpF?r_(7_=p{+y*RHZtoN>?B&O+Z!3h^jOWq_p$c{t2k6Ru_T74!+Dw z9<1u!eus6SfCmYK_m6J{M-PbG9iqbV(is|>2~brWKAj>eFD5`0arktLsJ#5P6BHuv z_BWuY$w5)G4ytAWiW&*1lOX04K-C;TQ3FXYF`(V&A}TNKplTkVsJT!G@fyUOUppY~ zVF0HMkWP@B?|_pIhzD}>36L7_-1njV8&Jck8EP0bCU=2t1Z_@GK&%M!fh|W111koP z_JG8?K?{1e9|YNdZ@J6dl8?dN9hDH6;W1xcN-~IKy~SQUP_BT{~1c#EzGXK|$4R zq5|I6hN@B*>LjSjf}{Wc?^FPFKpPnu81^a5Y+%^$GqZu=#noKU@Z+of0jS#FfrPt3 zyZb;p>Rw8MEb6?szX7TWGKd7pVxOU53>mS4WU*C8KxqWLbYKA%Efb)oBWp>8M&ki& z>akd%4z}Xm{s&mp8(=a2!C{b--tA|=k}D0cn7`;SDBkbwXMiRvWG^#dQGfCfRQ+PC z9iq88pk@WQB?VeL2OCS-x(}l30QQ!CI(A(vp}HPm*Oi!u)vi>iE(Po^)W)uh6{^bt zyRNUfSnb-j7vir3?7I51vFgf#>T1BQs}s9jYG7T*_FurROBuUepmv4fxBU-LTT5!t zlmpH-0xy&HfO8=Oc+EfvXzz%Riogp-R7Hk+Kq>3n{sia>Xz+}gz>C{CkU{}GGbZqI zHK_gv=ha{P1C~RIW~j=>EEJV_$3fKz9= z@&VM5;PM_^hX}j~hbjk`$6!4IFAKrOgDO}Cs56jte9eTo1zCp~!~z8@%D-h}D*t*6 zd|bT)=(ze<`yF7qKz%8J7gMpAzZ+849e{=(@(S{4F!K@RzrmfhPEg?k+7|ReFatgJffd3!pAWz-4RBu~06GSQoI)+Yvl=`EGv#cu{T$=;Tt+GNE8-f`I13IpF39*mn=W#}UA@^{+ID$Dqb71dlM@ z0xd)fKpxn=oCXR#=)kTe*m00?Yv}kq(wrD5$wL>L%mwQL%^86@dEhxQP#+i^dmJyX zod$&;*q8!beamR536M$?WCB#PAYwvq0j}90Ib52zK!$r9@H$=qoM3P{-WOs-0$wA| zrh`Haml6NK12XsaFThecPlm=a#NUwi#R5=a+IesP0W9j1v8WG+s(*k*J##7~+L6uY z+6`+iWx<hB!gz)U^C^WB^|bz~A}-eBu)7d8Ye8VxWDOb71E( zO$MLD6b(7gGzqL3bh1nYNMSGRJk!0-NavY?huT0}(wdz?R)JK54y*F$4TYX(>JC2E z5^({!c9cEfacbC+ zrXHYeft`0jn{zE|R6O|GZ-bcKE-D_dBTY3RN1En>!nV5wa;hlkkbXl)$VmyBND|!! zoh2$6p#8or&mADr_raDz_4Nj@fZ`uKs0=>Mem0V9v+Yq9v?EQ=f;UdKK+Ztz-U4XD|m>_NNrP>wXUg73gLutEuG{>@KNjx>E}3Eg9N!x9{RxQ;aKgsE!)oj?RR(o|Ur zyp0G{7aea=IRe^*hjgSVh>v=tDd=JZkRs3ye(;f|rz9B|b|^3~Fla;1Jp>(TdKq+z z2W(;nRNjL7U>+X51wTD{1O9q|xBi!ajx`NYDFDe=pqy=b)&R6uFhxbdr+W!_@(^;o z=^Os0E(6fPK{+bWJ(ocsg_b!g8vJcc{NVFVLHR?0zkMR?1c+o%kYtuJY^*e&2RZ{! zfxqSZhA02|xA~|zI9`4Sj$$dW8ec|`8nA?augzx1%P)N`@AEh1_<=S%|L1Qp_5&SO z0XoK16Li9Ch)M?Z7*o&|EYPqsXqM9j)H_3*WNH99$<(0rn@{Iq@ChECy*xIcf}%r# ziGcxh4vLTEL;fZi(2WY9^Dth4&X+ax?0n(hYqHr#8+4YhiwZ|)iHd};fg%Q7(d_wsaGhcfWDWP;8&vAoIO^hpk6?MeQY#d08P zLC1B>lmqQUwsg(>1`0FB=3ff@Egv>K`R~$s5qemu=jajLyFv%%DS>tUxEffl9b<3JeV0xsbC2=E*WJSZnaNgz$q7mDAbmV|kaq z2^3slckh;kl}Q_AK{=onauA%XJOhJkrY|_|A#N0exY4(lMaJ>+OV9?@jwH}-XUhlt zO(2G6ua7MFz=Dp)paVHAU-CDB8P+bKQ%F6U4>Nl9<~n#b|2@Fp{8XL+dJ5@UP|SOR zPvtEK9lZw{|H3$hbf*UBtXl9Xq)&Z1Ux2pdYVfzk@Gvld(}*wVIODUh^w9}AT^*D* z+CU5s&|v(t{SN)0{z(kzpyw%&T~wWrjbc8Xkk#Oz?U@`ePR4=;p1@ltVpJr2x}kE= z9ak>h5WO$EL1$r30PXi|lLen^58m$?&<(P~1z`usZ1DCD==q=!J5mvLxPa_{>~sRz z1yT#Q;|OFcH0U5;%Ln{z^FYUrfaWHi?N0#P1N93?56B+SrVr2}XO0)Fv7p)?d=x*D zA3)}U)V>Ubn+uM9VRZ(E?ofv2PmC{3!CNvx_Z}SJZ}}+Cz|gJH{FM=WOQ&zt^N2bW#pDgYR+%Wt4CHE!?1!0>6PWI3tLKa_VIU(y5mjh*K|%V5eS!7$~P+ zO2AIN1TjDdfCcb3hrmv~tT6)Za)+FH>1~8K_0m`v^VCZZ|6UP{Q!gbTr(WI!A9sj+ z>SZMC)XQi#P=MX$Z>cwg)>CC5#l5goFCV*ujzs|-_i>xQWq~_X&2*3`(usY6FbNOv zVei2f9^g|iSwPCbr(SMUg<4~112sa!27HDG^wi5GZXj!rPQ9#^fogDp9SLsj3{rx8 z>Lm;8)JqTpR9>`Pgf(hTfR5#aoqCxH6OC~K6;RMqFXKQ*TUs9AZvrvEr(U{(i|{A> z9lu#2N7_X2H-VU-(^Wk9o7g~pu+CAD;BSv&hq`V)>|DQTphVdWIrTCW#0D*`gr9o( z*BNx;5d753$AX~U#?VtQr-6?o1)U_>>n`8{K5kMABm`=Uo`$*n5ZFK2NT*)5fer!f zL^<{H4(KpV%YXdsAO_;p%X)i|V-N7RD1sQMr(UkGgE$O&>g8sXQ!jVxfKFmTKK0T; z2NVY&x57`omsIS+bXCiL9P zGinfxNatQ|0v(>vd=%;2%c-D~5t`A?y{v_u##jP6jS=bKgN_`~nM0tX2SE&QI%$Nd zt*`|(W{}RkoC!W;>o$MOYh0H<2?Le!=sj<6SH6^U$$FNmx$4ya+pE@&xE8FnHi}S-=kkJq9|P3=}jUV8@X@HvuePag7A1EjBoP?=908$MPnI>~k$UslxafPX|F^Bq&8ScBEX5dhP zo_wi@a`NS4Scu*N9YNU(JNa^^71Uh`F!^v$h(k`k6lL%QonU_xe5S@5{w5Fudh(?P zf74yay#gE_-8P_;FWH$qE&uX2y|)C_XKTP64F2X5ARhSS%PFwPNCQP;W+=E#)Lo+D z;M-fH^3S*PpO3bQO6SMU3zuK`_Ubf)j?`>Ez|{Otfxl(%@+bd&LCvjSu%pusgAQx^ z28z&~AQt!-(?3l7O-*10|M^=&KxeCE=BWGwwGP28YRAiO{d;v*gU#UuD|^e|at|JK zS3n7)L?y$uvy=gJsOeT#a6-v|A7hyT-Nf?p3gnysP&F38-?kKdtQhnhONVw)+Xb>7 z9W-+UUdw9mVrK}bEfJz(0GiE80BuAAb#`86fzD=}06xF+1^E0)@V>nToggz}Am>*a zfO;kpFDgPn4JuHZs2hBDVhrej1LX57`@s6agI61%`VBx1ka%Gm0vccO0X30gR199G z!q07lx}Ozv#7;NV{Rdh>c4N5zXE0Xxp8~rde17F3P$+=fRmb*U0Gk0?Q37wT^?*<9 zgDs!|dCB0#(qM>}3_!E_@N+UiOSwSJB2XBC+F~y~L3V)KP2hIoAH?~U3T+^_LhS+R zL6{G^ZqgNOJ~*_%Lz0kjIgq&^wJ$fr!vTDLr8@ZB4e-)m;XR#Hi6v(I8KoH{g`?5PZZC^!%Pql=CPXwLwKW zQPfF4A76?D2K zKlC6c*w+TKka*7J5%kBy~L-9Wk{Jh97;C=^m zGy^mWvPTCp%&`R=6cCB-5|xZj1Ly!WhmX+F|+5^<-oDX6loe`O;4eC)Loe^oN z$-vNC#oSq=qTm5JBl0fzSi?QwaTosP^B_;d&WOAOs=`4{{8^xyk01GrNYEMh;2Q6~ zEhvmZXGBin0hR6WGa@0^;=WFsfH)sg0CY@z=NZ`fkjY>E|M#_g#ortSIt&MPKBOV& ze0$IVf;UA$Z4jjMA=5#}iGvy|3?LcM`H+er6R@5S>ClBVnF-2Jpffi>NfFd}G5}3< zNW3`g56L;;^C7{v#Df(=SH*#{lf+A;^C3MuZ@{7eazy0JfB*k`_v&m0U9bc0Y>R;p zX@1M!VrC8NZ0mqe%T8r@nFH^SfqPFPI-pdaqmtp<`3!O{XZ-Ev;DY}fe+wt5 zez3ITZj6ukyDTf|_JVCxdx*zVq#MWdT)m;9lc0&{=Ak z|3Ot0bYQ4zK73&4y??LGZt(bz3+Rj-P?UkrUULMW`S=rb@>-|4UvCL31L!RHjxf;4 zS(fkkn?MY3(Gm$h?(+$MYXInE#ct@Ck6S>E^42H(t*ZqY7<`b zpZWL*F?=n5@wd+g9TEsCeE6FRKu&@5N_t>tK3)ek+(0fq zCj~w85!6^|DUkxDYe6P(AQ-`Xr3pLY@dYoa)%1kF^*%4u>3{g4BA-E?=?1l4-}1Mt z<7Z%S0JkuffP{Nthd#!E4t+eC*69m5^wClTs@VX1`sG{xmiNLijZcM<4t@N=#NQ?- z0PboqdN%%roIejgWIX~L#ZUNK{XrguH#IMbgD&C%9f{c*4N6#`$VdYnLI?78EZU)u z@-PW8(8+WlrT1Z`UXuU~?Y>8jZxNUrH^fG0BRmv*=wr1HIP^|}?+$vx-+BNP6QGi+ z6MhtCJxBj{A(>?D87JFu>=E|!-3t-0(B44sEu zI!`!uUfcybk;zB%l}~SpCQ2hEFHBakZfiQf?W5R@#7yDUKI1-k@qa zMuh`3W(I1Y8NB3zRPvDe6x=>r^#?Q$2R7nCHN=RBPS8c#ouG+X@Vx64FOWIV0V9QO z7Zq@8FXClB_yQCM2JpFzD&Tg;FVJ~v52_&MB!JE@1Ubb3G~Wxp4U*$UJHoIK&=_=# ziUFvr4RT(>%ljbb>A~)^_3S(gJ%1Wh5VQnKg2qJ+z?BCZh;3cUz~9miI(HFL--A`H z29-Sg+abzkiGu5Ukh*@5I#8A?Qvj=r0iWZz4Wcd=bXcPmNSOraI#JEDFSUO|&*KvS z9fb=@ld_JR3=XFps6g{jwxw9kJtuE{oSEF zo|e}@=Q3Uc9VYnA@!&gVU&eR*O}d~nlr_)!c7A=C2X2co`1ZO&PkrPCjWUA{CoAIc zZ2t9wzj-@osHF3gkEILfEHV{VP*(rO-x3NE?luDl&_5Z_fR%u!<+akuueX54(-Bvn zEeF*LonK#G0@Y3M`10*7g`Tsf4z};BZ*KvMCwL0yHpt-44=;m28esA3+gl1fzU>$I z^hJ<*CQtB%$LqiXA6|MPt4Ey27y}woKt7L=11tbPkMS!g@(%E~Y(hSdu?#fo(Cx+n zI(4_D22`t{pU0>TQVuzfG4l<`h}--vCt>F?9zZ{j5p;nosHxlzVt`APvoN(sR3O6= zFS$N|55a@vH)z}LxQj{#XqM-t(lgKzckuHVFFgfu!DCOnjD67a7@cNfIgc?!MFNzq zI9_mpGZT2lX$Yu+&3m#Js?Qvx57bvjK93Qu?~*4dM}xTCF)AD{_dNmG3^|Wc^$BQO zS%`|q{tpvCEq}1NkV!R&oyXijdSQ0H{Q4NA7c@u@zJRE?1$;yY_*_MSK9B)1D&Vdj zc;Sb{iw>}EP%Z)$N}vp4@G|ff$OzE+h)?;O^-mmf)>w! zx;&k8R6t|zpjlW@-w?EW0@R{}_4`1@r@;$fnCT!7!~2z>$uW>xP>%tuw;N*C%iXWR zNe?tX06#zR3b>R3pP$(A5_~WsGy^_?NFdHnWRnJ^;2$qvc6|b$pXdYXAD!fHT@Jck2GWxO-M`oknf!#N|CbLwfubZv#Q=1>qJ(ef z9jxakmO;*XM4X@41-hpOetsh8ig$3Pn*kE;hMb?cRv%Pm!Ol;7j5t400(5?#0r(`p zm#lyO{|8sBKAm43J1>G9`0~xW|NlFWyL6ra@fUSxoiE>v+hR51=)URpl}rM++aA3$vY-7WyK z0b~=%6ClrkY=C$Ml8!)W5#+=d|6D+sq(=p;se208d7wlG*3{hto-_mb2OI*>lhI!8 zeFU=co=@ke{S5sOZ-Mo9LiIy$_C#0;n{5Cu6O5j`Mx#yEfs zg2fC*j2wLcan1s$b3pM7G5}-{EDM5MB=N%83FHsR+$?ATDL90{%3w+6EZ8itqYm_d z90i>{MKu#L+xy~(J+g5zpo$lk0wF41W7lyBDk+ zvngo_I#jXq-hKyYGaJ1L8j3^TOQ^mC9QtH&=$jAL2R`xGpc|Bjp%DfO8&Jjt2PAYv z)Ta}4^!j2uP_6|>oQnzvDB{3syJ3ehLNfPD18@L<4R#>TU@zhfK6D?pMY|NfMH_tL z+AUkiS~h5k0l6HMVn7)jR2WFSkOZfANQyE>K48Rl_cPEW)vzQ(Sy{DzG@9I0n|?gkCk)06o3Y<1E%Wh z(0D{reFb{ZVgjb>N=&o+p{g4&Raax09Sl}|Z~p>J)xMajg&=jw0q{f$;z(go`w`LB z1Z^Adj8QS@a8Z$X!C?z3gF!;wpaxqvR8u!};sY9tpc4lrUM>PR{Xr)VJ^)()(uH(z zF{&*v3(BpCx4_~RxGH2IBH9Cpi1r)cqvJt`_$d%E=zGo*k__+-`qqLw8~64zV8+IN z%$UCO7VMn`<&Y$YC=oynM~)Z0P#uV&1W?1DY(v5JyxYG3M~U^;3KAd)OCUoXk3m-%fL1Ew(6<$bz8N5W;1c%K{sTlb zvp}IF@xt5!6i3(4mXa;T-{Rul3%31!zH*(Fsoc(Bte3KxYj?$G^5iqb8#p zqyluZ9B7&l*{pTYMC1T93o(p_WK03nm;}(^8OVLeCWJvvNPwDvNLi5j*%+!BJ?4Ic z568K;{{RkszrkURSsYh@^_>Fk8(07xhD3HWXt^BdZm}2LW}vw8Q9(EwlwzP82OGer z0{+|2P=lTwAdarXVflHmzI&hxW)x7hf{()oH6(?h_Coy&5(l?@8zDz~IiPBTk9+dq zuu&PJtpS=wL2VmQD+1J-0JVn@t%=j-ApgSJoiSJ%ii^N$5`2EM0&z_scT=L;R`0IC znm}l$DqlB&9aD>Te(gRJ(6-2L`yVtz!XJD=8f4-t1ay~WjEcdFQzjq}fh*Gxl?c$3 zHdq0uYIvy)J{;lR{sd^YM=D$jZ451-P7kDK2dXnb?HJ_4Nx;{)M1aHN z#Z6;SYX(%GfT9(YK|rMe=)fJYF6bUuNXWdras!-97;2#z4nAE1@(naNI$+5RWFEAf zhbI#eNI~R)&j5FP2JD2yZUR07*zg&U15Hc^F!R+s14sf#N~pC@!0l|%VKEP2>#ad+ zW;k9H8bHEL0<=Sn<7Ml4kV5dHl@F*2Jx~?;A`~)!hpR!wy$Vzf$4im(uu>512+E84 zpu!G(1myv!=g||>J$;D#(G$}QNSHN1wILEQG}b_;dR#Ju=tU%AXvqaS@WK*ezye$b zfO^mq@fq;?DJXOff$o`bfF@}SSAYzWf%*W$6`(UI`@xy<-2MQl3FzLxuLto0y7yhd z`tI#-z?X?HLE|1_Gg2nr4#~s~(9#jz;%QL5=oZI7wY5NV3#`KjDm%dU>KeR=hH3>L zkB(M7DL_sTOMqr(P<8}mW^nxlI$ssk|A%H`5penet-k^_&p??NtQy+afo9%&S3s>v z@Y#$3Eud~F=!A|=XtxM@z8Ba`Py#o2F+mrUz;T%gO7#XW=UoBCEBI_i2O^BLCBn$a zE8rqV0k5wiE|ddh3DEt~pi%}Lc*wqnxKJ4E>0|pBz#;)O&ISuYgBPoHAZZ31{)jbP zUEnh(!AtlIIzT~%x&*LP2NX0Qv2Gs~1CT`$FQ^y~4qEotfy#a#l?Pi4FQiU#Xlz1Vd1xZ-oxG?}60jF5AnLgd)~0PMP=H6h`Krt9NbaHdWG53<008>bC%Kh#ANAc`7L6ER6>jqpJ^Kn_a3VKwc0=PW@?#qKlqQNsCR$xsa zG0=n?sG#F`82~=*=H7k>Eb6(isQ&>z80Ovn1T5-rfl~#l`3vCZ(4cLs_EiTDs474w zk|jXJFvpAOU?aeNMNsNK2t6nQwG~u^s;J@^j zuoTh^Sd@1|lqXBqUx2fGdxC`wzf+Rj65Ho(9&$eh_k|@&hbh$iZTX z9K=lwSlncbMfoE{)g;i0lygC?c2Io-s!l*NprGmm)X*?^aaKHnlfZk1(oU`G0<5@pnM?l@-^5oTfkSv z?SIgmt5nA4WJq2CRuLM;JE({=pn=b{x;c#!i0~Yn4pmB_> zo(HV{-F^k=DPtTyoiZvfPJmU0fX>#FQF+<24^-dX+wTBYBck$RC0JTSKDlb*QlK1vEz+{SG+P;AgLOQg+0Z|x(icaw8tt?nOxG)BZf!ku=_JdY8 zf$n=dw4Y%jD7Zk=vEaJlog&CK5Enc)_ycOE0;;MX;OK{|S`AipZ2ttP{m^w;i%`w7 z2ipp{)OP;@RHe&N4g3Z&up6rM0IJd&RHbV`N;{A3e}Jk=4b|>ku&R6e9iaXY0Ch?@ zUKl{l5&&g>j+eW^;rMQU0;(!5R8`qvRrmHcKvhAa_$f4;IefZhR9?z~)x6uk07cC~ z6g8K@2VB0}e*i^It^yIUM`;EfOmr(T% zSk#}!qW%d~eF7Hsv$3dObOO{wd$<1pbn_0fd$O^pzYaD30T%VvSkzB}s%OCBp4)Pu z7(w-~A5^^pHud0;M^!HXRo~EtRK0?#NJw?MLIF}PqBU`0N6{_7Vv8#lSGhqCpge$0 zJr-ASK-DueVWtXEsCwkWZ3666LoDjI%0fa3S-mGzy#qG&@|fzmp^eZ4Eb3das6PTe z(&^oP1=J!x3aS)(kRuy7?c4*Ol~@l6eg#POXOx8mJ9Iw#6y&(G1!a)XfL0(psHU}p zPf_~?8ofJ!s&KOm#79tTL%|B)?SBAO1#TE9fXn2a(6|FP4nRxEIbKSFRf8SLfH^N2 zAp>zJ(kS9pNR#*h)aww_U&N!B{IV1jpx~y}tNjentN>NX3Uw{S4KJNQjc07=6m0Zkm>qn03p;V&z}kq161G69R0RH*65 zT1=o;G+LPa?Z*l=A31%;9D2yz(wf*#tt0GoPfoFJ>;166+ji~2$=>WiW3A7D}Mh(*0FR6PTh zI26R9{s|}`z_;3>U3}3Z0SO2NEC$Vxzzm3*1CYeyfK9y=rh2;rpehiuh!nhX6*Peh z?#EbxY=$i)mv|`)ZV!OQ8y4UiHsFA{2h{uqcTAx@rYzWbY2Z!1kQHj6A!bnGK@1dw z=IlE`N%I3ZfngH#~7b&D9fTS0b%j07os z32H$ae%qe_bstC$OIdYa9GfACvT5&baM{#=Jjwtv9?}e2h@l%K_p%I{C>LPYm5p7O z3FI_O573A#wA&4?`XpX(i9+HOTyaUfbh-e({0DRp8EkF73;4`n@F3}f4p5T;l2%__ z5CM4)!g-mBI4AM~vZB?5SnX

Uw}(R}FSu#!y`h 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 t2x1)CiCYuo1AvCEO@&@Bv2Pw(0|L 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%0A9{C0G$OC+a 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 z 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%0Dcj4c5(6jmH2ma<)GN2?VqLRj+ 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

^DjFow;SCV*R~poZ&fa4drwuITfnp}`)VpFJAi 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 q)58<(GgomOQE@pchd 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 ?~9X3Q$oA$}Iul$`CYIr2$&$ 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ÐTJ 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 z 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 z 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�- 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⁡2-VyQe_Y9z^oxWpE-n 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�J=cT8q_ESw?_j!x~*SiE(Z-*+%7QzwKerUdLcJ; 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�z`&5ff93y!4Gat#l2`u!*$8SE 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


~t73=Aru_{AYVQ38_xaOv-pU|<0CZ(;WJ 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 z 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

VqkA zKq%rW<~CND2r<%h7n0)LFvSc=iffS+D?y7pkY8@W6e~a#Gnk9KhFA=e2K(Xx)E5j4 z=2l20Em&?L&Pw4Nq>Q=%>)kRK*Pmoy2-poVoQdHBD1~saa$cMby1MZs1H+|iUWN;x zSXq9Of#G{KFT+<5XVysu2Dutu2ALXO29w^C3=D2HybLZipd4|XiNWz8C}Y*|GUR|n zFBLMvEns1AxWUB0*uf%W^0APS;YkfI!y}LpPe4l{Yk3*iYk3(QKuR3{6*4jy*YYyx z*YYwL*A*d*U}I>w!NkCl#V9o!5aS$ zQ$ZY1?CfjgW!MAafMVxaBQL{~MqUO7kOAP>5ozLO;A!GzZ~?^*%mNmM2_Oq#vGb~l zm*GVdFM|mvcKDll8F-sP)37(07{IY(+sw;g+6;{ym=SCY4?sT4VwCzjhmpYq6g$E# zybOXZ(AcqP;bkyufyT~ysK*!>9Bwf&u)ty`p@o+r4x|ATJFP9e49y@8D0Wu0@G`7u z0VR=J(AeQ_l0Y0#2zPe#GPHMtQp#;;2*2v)WmwY<4lQs9|AQLI#xMb7BrJs6`*;~z z`=BAbrjM6lRUcRn1A{lHW_3CYDPh!!E;ybQ1VK~4qxE)(ibW(I~kObje2HLl16UIw8FAf*h(patn=P_=9f4tJOs z7{9adb}VFMFySaa2IKTo#Z55 z2GL2p3@)Grb}%)Z3<)4LumyJclXw}jC-E|vmqUjcLDd+zEOUU?CeZZ@3=F0T=OHl$ zs&Fb6K>o>kigV%GBDg@Vqk*>$<)cb3==2wGMFnv2Qc74(tz*+XtL2*!F~!f$)`=>Wk{I<8sNRh z!~jn6eN%WDdZvKVF*wPaK;6mAPyjLr)*Rb9g_mJ7$PiFt^VSqzh8til45n|PjZ)AM zK<6TG!T@_dgp)Y}+QVlswT6}wpiccJh$2pAY?}}(p=}pXu-}9!TmWtMm@$U1Oa!GH z(@#js7#4#qSZ4oMoE zGZJ7@45l3iAbtlqWH(Ifh8T!e@R8|Yzwbs;_6Vlz0EV)ANXpokLj8ULp$zQzXrz$} zJ(wZ~xS|lK-y5OIKzJtuq4dGcoL12CXwDOyyAVc)57Dd21cV15!C~GCbq?H* z4G1OBpr{2G{igoV=m(XZN0);G4y+)Allcd{>@0>V0+pTbAd0Y;oj;KVt0h-}P2*&q zfMhph+zT|WT@LNsf(FxkU`hoLgK69oPt;6d;ZRWFP*4Mnsu?nvPC*)A%7$rqum+NE z8O+xpNrNL+VJ%b&lG1lV*AcNWEO@}gz?jU&*|iFq(j%txGI&jgrSykP3`8&d37}8}rF4;*ybJ;}p(!1vj+G(d5ybo8lpZjX zm%#_529(laYB(7RKx$wqy=NvbL&r>B2J`*sDg6P$1CZb_FNQh?6dYhbG9aZk&^!Qm zl$C*j!CmMW1H*zxObo|XF)}y`A7fxRHiB>9~%`56fLsnFa4^73PdJj}};D`C?n zfuIE(uzUsb3C|jE;9xHuRzY(N$jEqzLYR>cpr?+QF$QunpMbA^2x8_+hJ@k)xSc4W zcn@kM$nHLfk=Q~JcFxsh=*lxtO|luLTmf}^l4&k<+zT|U@)@RRD)P_@!hwOzT-I#h zX*31+G+Gr@Kgbe^wb1ZjKx~KrB`MP$Bt^C`MG9z&8XiH47?4RxFhve%iWrc_)f-`o z6kw&IsST3!0+@6HTsi9V)o?iwVNT`;t6;Gaj3nI+ zlU9JoMmm!8DwuQvOxpYnk~Ac^VFojpszNvGfx_YoL@RiOK?o=Ff#oo-2C{;yYz9+L zsA`ZmWjBCB4ts$h3XLmJY~3C$i@TuPcH8&yGMMgz zZrfdWh?imZA?UWE;!wKlN-QttH42dV9+jjj< z@iN$)f^OT@KF!M@ej2)M_rp^rh9fW0x9uKy!NhQ8Gj!Xo>KR@J&NI9W=Boug!CeAS z8U{z>0zXI$gYp(AkAt`Ey1j)Ipv(*(UO=|(-rEk{wwrpEm%;ZeC|rvf84AzwGDM$) zZrjZ`&&v>W9@=hR2sMF`;loSFw%vtWpreX;7kC-6E2hp_z&?eKLd=#0uCew2GF)$=dI99tpyi(8S*ajGWejY0&m-e2?}8t0^965>mo11 zjElSs{xGF5TRX&#K0zf8!T>lfv^*Y<2u2=9yBrQlI9lUK9-SrFzWgypsx9t`%K)lGxpzxZB zf#r{IKgfxoZM(sjco_mOLAUKzT;gRY193pxcIREgye9}?NC2Dpg7+2gFM7IQ1;S=sbN4E2Wm-QQADT-gsC}z zYR*$6HKi~$3sBX3LsBynrltW^4Z9M;uDvid2`FmJomCKOz(v9X6nV(D-GJ9j3|}52 zZ`(b0iI?HXCFr)@w6Bmf#ljHq4zg``-$m%Q-TKSC4EC3y+jjG>@iORNgKpc6zsbuW ze-pZG*Z&SL1OFZ9wq57@ybS;ELAUKXJ>q4sc?8|I`{)rb!y*s|v~73BQ(lHiPeHRr z@0b|C+ja$?@iIJq3f;DQ=Q%IKwdc@nyYVl08Ps1ux9uK%#mmtA3c79A^BpgP{ySc@ zZM!<(AU@(@5cmk$wmWYpbQ$UD_q+^C-$Qq8{d&*K@Z~*p87WK?A49@N@M2aUkRH%7 zQuhzM49*{T8O&3J&_erw2RxU6l0SG+tTohfMurIxbHK|;n?LX})P8_2ioNuKm*E`9 zz{&h*1};D~5VCFez(*zqn_bXty8<7188|-jGMI9HhjUwcP>;Zs6n&B4>3-w08@(Cu6r6u8l1$?w(G`1-NDAd@CmYA*M1*#J$c1P zUWS~H(DmeOpLiJ&dTv;$=Ab2{eT93A$4+_cJd;^k?XL@~AJo z3~pa|85}|D$sNA(GH888-mcpYwV#P$!6)zzy{_HRxK{th%b@rT8rNmtco_=5LE{>x zhlSw-NY7qY3y>aATp#|%%dr0&FN665^tgWD1`j-VTu+1A&B&ne8JuRoasB@rFT+oe zy`Uw-e&2Z+yuR}?m}~H%#q|MH10f5bFF;LXW(WY8_?b6i57aju-+38YzC(R;=sPdN zzVA@q!1S;(OaSTG%gP4Q1MLQu9I$UJe(*9F z{eY(2wjaCI83j=d}H#Hm%-pCFN1jmy5$O}mVBy}+|O!xxXtebxbS_Cls;$`>(3UAPk z{Yk%g89IJJiva%LybPSbp<7Bae)BR!{RYkBet{MN+<$l(SpPtafSf&-fb{HTbq47HWgfl%ybK!uc^S-ApzRD$!vGu>4ydIxIJvbz?Pg>+05J!g-0J`H zGF1MDCbx6{c^OWD3~WRd0;Y$RApoRjFRLI(56Cym82A_#G4L^%7ebAN`{n^66~ha*YjEE*K+FOA z<`DxQ!yS;lpn}bik&i)_k&nUL8NCuafNCJbH~*m~vNCJ{nfQg*@F3JTxr}@a>5Nd{ z>|^9(*ue<(4NMO^!v~O_y{z|PzTs!$W8h@sV=#X$00|_xZyHc72geN`)XR(v3g5v+ z3fMOZOneMcOni`&G&VBvF{}m|*oLif#L6~#^T-p!XEd)uwgGn!dN`tzF;Oq*W zp=K9`I36@~s(T3Pc;YwfUJ{3B2iX+_(=LGOck@@!Eh^H}&8;#l|?96)-&n{^+2XJT+T z#t7N0Ys1RNpvTGw*{r*a6=DGsgTW8TW?iqt(9OE{S@{@lv+_YU>q@fmF^ID9F_?Zq z>V|3_h6c+4XL!jC+FT}%)Q13j>j8>9gXtwMh^-)hm%_JOYigbawLA}Ku$Q!0R@6db+aM0W*A>0g*q1%y)6t-2t0Fv~!k49Y%AN1*<8 zKDOv(kWPqdyVdo8~Qjnb|U`ibj zN|A~Qn) zD8F$sbM86@-OL%x#>e2##s}HV*~`Yq&+F0C z7eO3QpGt#+k3orpkHG>$v$CR)8!9br}9}^D+G3hPD!5de|5a zfb{HTWd-R0wR!w`_!vBS_!!Lj(1%GDptudP|MMNxZbpU=5Oct-g!w#t3^RG4t%UbH zd<-u^2A)%fL=Ze%G@u#?Y4bR6LsT&{DEtDq;8agRePhSV$6&<^ZSz#{@-dX~LVW|% z!^)5V(zBQKGR!xdc=;IC@$xa42cTQ-fND9o&EpHTn~`Ax#2m11-tqD=ya3q?YQfp^ z@iAEP@iCZNq8q4yY9PcnWl$4Y84iF<{KESg=9_XpK89jGsBbp%@iDCBgZc)hhn<1p zH@M}s5TpkbH?R5l7@mVHZ&rW=5!fS3dJjXFOcgCajPZp!%i z7>fA$7|e6f4LpEqAcJWOG^RlrSMfA7xhf!%BPc6^SDAsgboD?JE=aWxO!Wao2tliL z(2V3tB&Fprr5BKtLh5Qz&C3LJCCJn{Fr^C+E(OnUh9N0B2vf8HNfBtMX9kj@H!wvE zNS1<&7qEG2k(7#`fqGm3Nhzet0hyW&O%ovZnZcAMK$S9>PeGPu4CQ1lfJrehm>T>- zbe0=ndLKX=fuI&C*hSD5X$6wvwJ^mWkQ9T%461lDlHwaM#R8u21OuM)3H}MGdrb52^^9VMI@tl# zwReHeZGeXOc0v?`$L&JE0}0=u)QrQDl4vMa1m~s-fkfayFq~Uvh&Hc~^;L*3`-unnCewY~& zenYn9ay^7@%RR%-$FK%eLxQ&DP7~x~h!NytZ~!R-Z_70k;bY(t;e%|;wGrcEFc9No za0G43JtoG-un)umZO_#Z=VMS3=Ywq175K}CU?h-A$pX%*UXr%m>+~o1)CekfaP6W%$p; z0Nz2-qs+(9rOXG}rVBHMo1x)9WCukN$QaNLip|P=4C_J0fVSzrQ|4oM12P7r47`Iv zOofj@M1>Ewt?wGtJ2LP@SllcEy!1(ZMwxOd<@AdP+tXb zLb3}7LjeObc$;p`6{xRlRrwgKRiVC0R^?+zROMrE04W3es#ledp;Hy=E0{4{3>z4j z!JCggK*oT4bzYT^;Vj4)kgvX~@-ch{83R%V_LZUj0}!JCm9&dsqr!FQ{!VWod)f9f(n8?SD+bo z1EPciFQGL54^;(kJ03u&;GD=%&cFuUsQV5&Mg~&Ibrot{f)}C$0yP6-q5VmaB6FA` z2ZSP&jk>3h6sN!xGvH9H2`vCYzUhJ~RzN6*_~t!Q>kQmOdVuf^SOtUmRiu&_tYjh1 zRgc)W?auoG$p=gf0gTKHj2x_-4cDRD7TeVM7+Tc%7)(Ih7FVnDF{}h}K-(5Csq-;h z0C7Ou7JsSpG5k;mLCUO114s~hR{?^K89qF2GDlJE=@j$4iE>lU2(l8AH!NrJ_ZMndhm8#E-gNW zOPYKP<{zO`DWF;c9J-`$*F6k%4jV%Q$T_gBju|?93~4&h9MG%7$Iz_<$~2$>QP5`U zuTWh~3>%o385lWPId9#7#>!S5K8DR8ouF8`rNhT?1H=Kv3ZpI`!+#J56f2s#d<^Qk zd<+gC0}!zSGnj=zfSDPwi8@f1kHKFT8Y^YGd<-QZtso`fZMq9|`55NtLSqGH1RFyF zGbC1)fZPU(6+t~d27WzgteAlqdeB(;{sofE7#KEyG{H8J#_91f#DLU+Vx?J+kD(F7 z0maG+JwAqIdLZ{RGeb5}v+DCPoYn(}5_r!UBXpSp8^Z&Tk+6`hFyvz>GlYihTthyF z*@j>}&~3WfP+iOn0xZnnZMq(}pdowIkdNUoNGB*{Um5Z-yZ~`PAuDLa$G~sI2ic}> zX~f51Zp6pn05Sl)5jxq3k0IWO53&&&W&tZh0>}bby1#71$8Zs31ZX4l44oR2}q9IT%KQp;xjfkZnSLjo%^1LG$a1(w^;`pCna zkHN(pS|2r=^D#7-^4D8I{t+~%YK>^x@@y(Kt;gcmFAw5WyQzv#R^nUurot~!pLd|^3WKcq7<{auK>}09%CG_C-FoPCAd9W}80Lc1fYuel)NnE!0I7im z$ro!rhIiI{4CdOlz4j^UV##WyVA487~G;za>;bBnVfHbzY zf{Xzr?#(uQ3>!hlfD-o&8$O0>AY(wvz=@l|mXG0|4LouCLEXd55CAd=*4R?FOxGgdQk>V_*s! z5KS8J7)&>kqDGja1xSiOqa4hl2$Pn<6dgcP1ZtaAASpTxQ}h5y5oq}BIg+9eFhvaB zh*loRx&SeRb)xsd!NAF^fTRdy-Et&FRxm{lNQyw#Jws9y4^xzYqzGi41a!s}6izKL zMGZ)bK-M`x6@ilCN|>SrNQyw#r9c&dOgaZsbO24!7o^VOTbLrmrdwlwL_Zdivk{wa zxBY|^-XKTlJ%9#Gf)6b8Afsy6kQ4>O6cr#T0{QtHlA;Qjq6Q>IAU}&ho3bG5=E4*y zz!gEpxYVGEKz=?1Q{;fAs2LhCAd{ZM6g@x+7|?>2xllzQlfXV_Kr*EmRL_AAXm}1? zHN?a)frA;m*_QV)v=*qbxlN}$!FI#9WkYdNj5N8Li1sb6t z!N@Ry6H*IYd5F9P5hl;duz(X%`a8il+rs2H88(3A;9C$S&`Wy-#DFlQXfyo_t$aWs z^8X<;DgzM8!1+E9G>T}h2`xoHO2OgcfK3^sqz{0OM=~=!0Qm-1(r>flW7uHF$KU`G z1z-GB0aeJzV8F%9z|zJj_4pCAr022cW8kodmh>=ntPBoZ5buMxAbNo0K^Roh!_;sx z1c21QO8ORiK86N+J_hrB=p}su!UK@tFy9Jw4&09o2qn;@{SBBF_>Nlhhe*=kh=uRNg|v5mLKnrbFf?#6gE!lLe+o_Mr|kI{_SnNxIyWHD4_r*xP+E5ibANK_+II!um} zVFO4Gp3;plrtJ^`0*P8v6{M-0mruYE#>spEp$r^*kfryYNJ_y0asZn$NJ{U7whfpW z9)NrUOX&uVd<Yy5`5VY~`7(^jx;~gt>3>384_8CMNWwWgbl04gUu#=f5 zB5k%!Mv_;9$s=vHJqgV%ATI|%%JV(%SH5n{8gInr1=?@Oqc z5u0s;k)(BC(umErX-LxEaB0{EP18~&=`5HuVzX@`QroN(E)ClbO0u*Hdw!PNgfB&&ip+kOKZ3RzY56eDRK z^bNM4YMR0H4pcSBn{^P?*b9NR(Bcdf536Ac9sFU9?hvpYfzZQet|2MD08`9>v^N^m zuAYq)vwvZV4j@c~AN&lOn=mW}9N^hV6vH+nNTmpC^tz~tGDY}5BC>p8=WKs@H z(E~I^xk!p8!W1c>DXK?Ov<;>x0Zq|FBt^GjiW<-qEk;tr@D}R32WaJ6J5nL23RA>@ zX3{aFWak1?lmOdBYkm_+8j^5eQlJgC=KC2K1bCSl80U2CW@0e$+|R%e<;=$r;LOKh z61Ja#;ifYm!+8)Vc|QX~feRmlp9>#@Nx^;whUcz)47XkR7))ySGceS<@i7#;@iCZm z?Pp*RbLV5=apz+&S+bvjq2Ha4p&P`RzMp~NvO6Ecd3Qbr7v+Nt3>nZC6a#|;$N`1y zJSGzkGB8Mb@G%H`@G+P)A7o%C_uykF1aZm^GB8~9;A1!s;$$9VU|{j&WB3N*#2jQ` z*y_p0u-uc6!NmU{14E@3A49koAA^b0K?a6r-h2#Cy!jYROb;?Ji2Lv{aQpBvIDjm4 zoO_UgVXY4z!$KcE2FH~L85kUW`4}vH`4}9x9b{nG@5{%q6T~@ukbyzUkB@=RkB`Ce z!a)Xx3V%L^6@GjSZg&oXu48;r<@oX-1H+qeK87XXd<>4?4l*$CNAofKjN)T(WIn{e zARfcVz#PNJ;3#m2f#FXKAH%m8J_dJ#LktWLgqayOZ)IX|Gd%<{siDr%=@0`$Lo6Rd zR4gBZn?G1|Lak%WAqIvgiF^zl349EWnTHq{4i@k++|K7?a4$Q=z+fQ5%y98NBZFi0 zAqIwbReTJ4s`wa8bE`v4U}Tse%M8A|ci9JM7f!5^k3pyr+OUPG zV`W$%i`1|UYUE?^1E~QuY+-6R88(2_z#6uFjeHDUjeHE|Z*D;B0)->kR|*JUK^nH; zO~4OinHl;%LN@`QY2;%#*2o9l1e^&mfSrK>%7Sgr1#JTM_z2x1E78QqAlAgk;DfFT zvI!Wfl?%fV*w$I6CO!s-CO!s#bp4=hw13keZUB|!xgVj4fdTFjaE)qy4&A2@Y~iT| z=v%>q<4H=)@H{P9L8O%ra))nh2OooU z2Os1P-;{1X2BmI32Jjue`F(s0ntgnbJABVg0xm?l1k0z+od9lntuJ)m`~!i)GA_!sdpm_Or23x5YASe^lA3GgahX{hCl3=1IU zfY+`1FXChHTm)UWx?m9>!z_@2J?I81pc)9-41B?mnIZ5SbTjbhMSKje7x6Keeudft zS}FMQD>xy8Zzu_YZWIJp zU<=qmclfqL?Pp@xV8jf%!*~97Xq+1_=VQ=c4vq8t<$Mg8%b{@&)5F5>0i5P1#}e4t_w9OqM^b~7?47=zOeIL?19=VSN+vKO@S+Is~b zgX;=D2J=940~1gUgsi;205y@BApm6JXWrZ&P~Xg2!N)Ld1=KfJR`4-gSON77Ob;u= z1dyJ+tkNJoAm8w<W@MNEF$bLBCT-+n=-CKO za1S@~G28_in2c`V0aODaz6ofDgeo(`1(1oKd8__FeIvh#k3o79)Hjiv_!vSrL45<$ z!^$9F2F^YjAUz=8Oy0!D(7%a~!F02Kybc0rVZhEvzUlo7uH*9Ynj zkS#Z1+8q#X0gumt=Q~Ujk(9FhgE}YxNhu`1f=Ym6NJ=$fN*5q01&z^4T!*+EWOV>c z(FTMfs0SsWsTicJ6sGI}QZWHKNJtAw5x5-rfTRF&umE_Ya1X>vHUqroS6ZZP1OvKHK>i+_v*EnC`g<(E!ROLI0tF z+MtV^@y%=BBGiCAmw+PAVES-6L;)y>=D`ecKq!I?`hizaa9=_wJq=U30HG9I#envU zfF==D|05KCgDKvCPz-6|fo6bAE0L6HFfc)Hxj`sJ-6{-fK3;+90QuY(rsDxZ2iRB* z21uC*+A3TEQ^cSL4<4{{8B8mo%0On#fGJZzCE0 zPzUTh>2DNk`JBAye zS%8%x0hIALnK|DuF+r|>ow=QlVd{41j^V4@`54ZFGF})oBY=!O4RZ(sBKd)~m@Y(8 z1GZWLMV`S_9Xf6RDtvXAp*|*I$FC$b_k-do9H#$)4m^1?)mMNL8>qC*LsHrTQ+ffR z6gjrc&7fUBkh{PRCw><*w5{da2g&+u3==@%DZ#=yjf087B&L9oL2m~igTfAITkFye zK88~u4ydhVwv&%RZzr_FHE$;$!=#;{ww497t);e$k3nGI97av0*hy!YCz242o zaCtYht@U~jAH)4Ue2`mx%b@OHVsNlz2Hom=m<1ZG#e4Y}a`!@`_0V2EhCO@v7)*a1 zhPWFPt&3QoG17ntCQ!7x9!01Dht2{Nc}PRz^*o3o7KR3p#qT&LvNAE494=sF;NQo` zz`YOJknr5c$KbjT+K_lq-QTHFGvr_H+%N;G3)?Yu8VH@18sQP zh4+y{pmsAdOn{gJ_RWv|d<>sJ_JVxlet?g``2Zh-xiGqc2T%=!_@)+WA}hlIkcnS- zb=jf5X*|HkPvKo!$VXeI!ex(=qa07)sNr3RYa^M?jFNa7CZDsH#M{v_?Dw5K#Fr^m|N?9f@s03g53yLP+I*7TT@j_uPa5#W% z1&tRnn9gs7$bxnjhd^Y(4L9)JIxE1YFi(6@1-|n41&9l}^0$J`j4_gB;tx!C)1X4J1ijKsEZ0JgNHdppDhpoAjE4fY@>GYLCvd3Pi9 zhr#rdu)|gjN&hsMeiF9Kvh6|Ge+{OegdNiINczQip#CRehqMKf{xFz+5_U)jBI%z7 z(@(+I{x1bjnShTVfNeQ`_70*FR3zxbR5l=T zBg;fcif5U)0hF|Va6y{4Amwo|&Fr44mT`OxXeu1Ld_a<%kP=?UAJCz@*_@ ze@(f<5W086q~Y6tO(l_}Z^5MDyOPZ{kfg!IEPO{Y1A}qqVFrd6=x8WALxMFk1LF%e z`Q>~}3{Hycb2S!iV@6xDW9$c&$Io!0^DDnZa?x zVFrfkLwpQ{hxiyA_a0_o$T`f%ka3ug!L&6N5wLZ9&?qo~m-OIuNalAAA{2q$r~p?G z0xmM3w}Y5o_k<|Sc*ekR7GfH#Oahl&kTDNMe~2nj?0kZ#;$&uk8ws}4^k)V_kvKop zVF|{tmJoQx)AY*%h$2uCmIYA+b`Rbn>?UOGQv&wO1vC~yj06>7vmi!tGIzk$hAPp^m{c9@;_$dHD@Y)doa@1gQd<3#!O#p=v>mPhkP5 z&krEfLY5Gi&V(uh8EFAi_5h&_)QvOU4pjs)D;}nZ0UnB=%i$~77)-B0m4VFafhki! zQwDM$s9O30RSYt7Gfc4qnqmf1-4Bp}1etjgrmO&=4CG}7(;%oSkYWE|su~cgz%$9! zP(>i4R0N?RvH+n7VpJ%!!2&YM8>Z?3LKQUJrXndTfGInGPzJU!7HMX!AEs!*3P|c> zFwH@dUI&wY0FyTVjWO{ClY-3Knpr`DhJhi#hM9r!Bb(?p4di*-2Z#9>79EDp+wMHZ z$54F?I&VAaBp*Y_N!YyY89oNxGthb4CFl7Vg3d$dZ3VCJF?Jd9*^DzY2gL?~%Ahn>r zkNII}O$>@Va0#`c1b(Pxj0_DB{or1L{{ub-&j-+6!h#2U46`2aF__1r z8`ywqAY`6)gFQ3DcVWREn!Sor_9#Fe$qA)nQfm@N#b$;M+o^wd$ z<{pR|PUa7aa7TkRfH!ZLY6Tb*I{Q)KxS!OY#>3*!tenU#Jnt= zOcKyR1DA(<3|0@Jg9Zm4@-gfHaX^CxYLECBWFA2W4dy@MW0?L3wAalZI%vT8n2+K2 zBj}*P>BoEwn;%1GX>UH^V>tK(I%shDDIdexr_c$SJg7UE7#bYF6Ewb}(Eg$RGd>3G zXVCs(<}*Hq)MwBbhv{KqH~`YKm-V*@6N3pT#uq>1W0?O86j9Kjc6iJmKm;PZw_5|X zn~~uI#2j$U-+#u(a1&%NsJE;4oR2~4IcQTMx`7K&4TSV|4?s<1VNh@c_uZw%puWj? z&c~4Q9O|1z&-obUJ%{=RriYCo0iq$@ufP8c3IUmCfkmcuAKq3q7n*>zL!Rh!M z)NV$G2@rF@zL9vr#~}0qnvT<7@G&I6;A1dfg>Ik&s(}#S{Dhjw%5VT=;uqeRFyAbE z!N)KcWGW~(-hRQyaQy|;H!wZy3=B@-+&CSi2jm;kmwXI@FZmeEJ<%;^K(!p~8+KcW zml+uhAm)I56Zn#k!TTlDHw#|!G0XuOsETgj0|j`F0Yx^0>0=LwX`rH>PaK^0IGG1`oQW*oRMr%h>+6hx?fTR>M3IG}~c!i{N z9Zcy3B&$J+#BU-zaTBJf0m(eL)#h$UO2N5*0+KSwiBvV9<}mmO=h|F|xl9ZRPLR1; zb{S|U-2<$yn>!MSo?~Pp&Y~k&DCCe#m8{w6=+Yl6SOFZe9gz; z`x;slaJ}JU_yOX8#t$FA;bS=a23izcd&|dg>MgV=*ame6JHrJ~l)vMQkc4KQxOaRE zQSYFcXU;o5h8gdm$qlB5lR>~4oZQ$zdO*qT);m6iYw!3N%uD`4ya&%b3aDi^IJsSb z+Rexi05J!g+@#*~F^If}Cb!J@dGBZp7nfRGkO$zFp zv!{`5D*Sh#NvD50cv zuy5?3b~7?CxPU_i?3?fpd<=mfpuSo5fsbJk$iQxN0~eqg2=PrO)I?SW1CWVdc)!4W z^WXy?!yS;RAm2!Rm$@R_doJ6+y)s~iEf|+s(}oq-lY&LLAhL78d?-MAYu^O zdAs`yq09}YtN~#dwBrF9(=mdEAjrf*n9>PIN+J0i)X25}gD`alOz8uJQgFA1!E_;# zvi&e+ACQ%S=abJt6C%jsCop9S2xXu)r?~<&L_mtbMS%g50`P#FF=)C~p#b7C7KRHh z%;4$PwF=PbR{2kS45FX-7)(IZt#dx{F-!n)4*p|cu=&i#VDOob!2zTPJl*Qx%FJ+E z9y;B6?=v66h0oCG*0e&11Z*b%0f zK^|@+>cl80K8v9`KyFNf=}Hyi?0n^cd z&;cI5?S&>|kasu36g@ynr4XN#F))}PLQ)D&@gI~yp}m&>U-=k*f;gaFOTafi2Cr|>Udz&NdSqpi`aYzxWu6fAKMxIzcCSK>^#V2o2Z+vhb1x6tKZaYQTZ<07V{B4?ma$ zv6zM70?6WboHa_&R>kIDd<<(r7K7?xrr&%F|9(O1VVE8^1_5_)Yd{O62UHK+{pMq^ z_zhazdLLpe$bDeD8&K^A*Te6jb~7?KK+FNx!~MVc7&?DL>*0I9`511240J>{Fagy- zh;JMwL#$Klnad<-Igpe??jKYR>+f1tjB>0xEq0MfIU^#{y1J%9KZ zI{xr6m{;F}7z_7}0;=U;-}pi8W@LB(F$e6M6My&^4uR|ib^gTv@-Ybi<dl_6_4dK8D{QdqKVl_{YcK^N)|goCV#$ z1*irxn0`a5HJw$U$&~?-H<21Yq0r(0l-u)QN*5r42U5X;`&U^=N@v29Za`8BDZW7U z>P_f|3y`V%U`h)R&IFg5uaOizhAC=5QUo%|80uM&NqnkMuRK6f1hKS+fx*-RNvS1F z=?5gGkWv_A>LMhi5iq3=P_HnUKSPoRXQu$D6lnIL4Ak*5m2-upQINYJim$>HFF;ZZ_5@V%JtW0UYET~^Kqv+)1NBisZC5ongfsMEiZ5VM4D$6d z=nO2#%~3GL3`osMNJAG?H*bM@-x&((4c+>#7J!Ok_@KX zp)-=8fSV3exB)qoQRbNrLo*6!0_z}5xdB2s|rqdj3gZmlU@LqWCICg^3?>?(Jn(euks0{E%~R3)uJ>GT8VT z96{&aUSi{CIK##dIrlceiUjtfpOFch)#Gvt6cYfmsR z9A@Wd*bCx-&b<}k;Ai0D;Ae0IoqLBr+}jQweug|Ae#p7ED|z`D`g!>w=iZ*+<7e2w#}7I8_JTJv!!jKv z$ho%<`1u+3@bg1Xla zke|T;qzrs$*-=4$hQosV492EKj0`YixEUIJAcvM^fs6qiTJ}bepWy|_7|@|*>O%Ys zszUq>4j^UVL(BYy_!)eK_+jVX@>@XM!_2S&WDv@Ud}TuX3?*Qt3|`JB85llzGc!1X z&b(bE#LqBC2vVQ#(;eES(u;UBghz#k0eF-8N@~S85}^$z&>&o;b*WHf&0iE z>K1du_nW7z6N_!(+N_#tQBE*0TtSPa&};2wCAfnkC#GsA6dCdiq$H%0gvPK)p} zm|lRc8wO?M4cgG0`N0H|*~}P2m?uuCWiYpf&R4@5HVme472FdUCN8LAQ{pOMlwn{n z)!zyUDv*JUI#2@@5X!*@nofYK0vV_eQ{{kA#a+y8tTK@SVyNi{sA`azp)l162-OfX zqqjk92ASCmQ`LY_g<__;Ikad5sRmb-3lJ(n;}_7gJa0qO4im!xU&z_D40=oqCR&(H|sfI@qe|rIhH2ttFbG5n?LcjQ27izSP-vHF^D~ryIH1s;t;&cR9_r2 z=4aRkG6qy%{59rh_zf}!qzqhNsG9IID4T$s1kRy%pzdL2_y95pr3Umd;b-syD}|iV z_8F>{lffW}8GI(~PGcqp6OKYgh8h!oh9VPw$eFYkf|waD8Zj|AiWM?4u$l5R{4(K( zoJl*)l%HXODL>=@);Z7_Fh&N0V8|J5RYptS+N&8MtX4$TG2^ijBei1(ITL9kBtsLdf}T8=xx~nHd^DK82m%_R5T(;fWcjc@hjg zzwI_uAtS>Dkis@bsa{YBgM!4#oS(tQ92z7rb*u~zK;DI&Njuq`pP?6|=5Glj156Dk z!v~NWSdct1=V!QQ&d*>z3BBe%fbaq&NX#{$+XX?jE7+G05K3Ud0T~K|H17(a>z!B` z6ha_p($<qgxKCK{GaLgM15yS~+#f9X8QxjI6L$~PJgBqwLYQO)Q^a5fZ)ky9C8qn46ve|7DIh5VS!cN#VNwfB zkpq$ZXgXL6~$7rlW0tJlVT7-3mFhvS* zMW7Xl45qqJMIb+i!4x^5DLT0hVNx|rQ38@8&{nCZP(>hQ?*=vR3?%WttM!{0t)2 z{0yc?kpf250va$0@DZ;-P*OKP23`3AiU+Vu1K}a zLnt!?;|Dg;(m*B#r`jtF3?>Cv7#P~D`5FAI`58=-uP`u3+3_ zq0E7w!Nl_l1B070KLeLDKZA+Q6$S=vH-3iauKWxp`d1hj)_d|ZEcWDQFj2a~z>w+1 z&tT}q&tM{Ug@NIu4?n|EA5d2xXW0&ySzMamf`1 z23CK5hWCE_46YkNmhHO&Iv%P6a%RY9s1JA;93q$*7@b*I&s!p|J^SR(&+x{dA9Ck1 zOferrLj-tey%wYvG<<8$cN-EC@CbgO1m0z(U>m^C zU;-Mpof5#$&=>L@nIF1E>ZvxZk_N!0;e~nIYGTiNW#y6$XZ<0sIX21Na$C zZ$Rwfg>6^Fbm40dC>7UPz)PEWI34)G~v#LDh1_|rAX_F17S)Rz%s4*JtS#x zT6qAIVgN5SF$;qDfsH{Sl9_=qgN3ug4my8h5y;P=7swAe8)Qo$Kf@Xj2Q+^p6~xaV z5X28T8)Rw_KSOsAs5Xm)E;W$~=4apt=7(Hv$rHlQ@D0QP&EGJG@-w^-;fEXxa5I#j z;bJI1WT-w7>JBD`4UyngXNRp}L-k?&48CFfko&c}!}uB6!=P~u)5F5>0ipLr+RKz-8{&d<;m4)x8EaDIjZ;ZWbe^sq5Z0O{Gw zY7f!_^3A_+euiHl%O{~1Q43Hl2dChDP`eo!4nWKS`^GAQpTPu#LB8pX;Ad!!;Ab$; zLpQJi)j)`EUP4V|W%vLx@e6OfEz~!MBlsEigG>cYas7?pXZRTb^$ko9JA*+qI81p# zdO*H0kK|`Cj^t-B=S8>N0o8J_Z@xqAW@Jc!m;?4raU?%OZX`569*X2=*atH3B~o1g zPU{M&1~QliBMpML*n)E%C$j<~Nr2`+O;XOc_S%Rv4gs-07)riBp+mIEHnv%O!bE;y?~??JW&CfkTL&< zv{wuqA_tI^!7YbQ<@QuUiUKBv3DL|9jIJ!4#ZJ(o;9n#^!w*n+gI1jdMDa6tMe#%K zxm_5=&oCRr0j)aw6UEQ)Aqv!Mi-r~jlcM<a@MS*M#KLdLVKjfGol~{fTj#y|> z5ERGH;1dTe3J$>C!4Ly33eMR>liU0_eumj`(9Cl;j-TNsNYC0*Mh2K376u29p1rI! zAU&YuCLPbuARf=pU>^Am;yrk2oq$?egOl4WsNIYV4G?p{$t^mbpCL3Jn%q{!^D`_1 z8Tj-ont=|e20}7VKovw4Gs6LpiJy7rI6!^#BA%b&3CL7X=21%EXOK&PW*(RxRtAPx zaOUv>=>hpBCV`(JB7vX5eA^F*v2foopjr<0O)S)IMg{|jIbh$+NZ@CflmPY3^8|i| z#~=gepd0uAku4AfTN~6wR)z$SiC=iL9HG8ZPUL5hO@zixNg_W(ULw>tFg@%H3qX4I zvPyvTfP8Z_k)L6IB0qzU~xcilEIXP>ahQ$-a4TrRs3=K*g!)Ca5Bi zc_(3t6cCOA&yhm9L1qsj?guIT0#j;$q!b*PU{gzxl&ZNvz3PBain_=RH1#U>2x2(M zJhL07<^Vzs zxZ|h)7~&|9qGvEg7myUet0mKNs8W!fT&_?bKR_r2*?ADE24tK*Obr84gn(j=?Fqup zD3~GvBt-~2{h&%gcGkg^Dj<}C?3@8r1F~~5OpOCV4cMP|krbVSDGESRgs@ZYDa3go zJ3qmcCLol8?2JcJBjyGTiv|=m=8K_fK<)x3^aTicj0J9xBR$HXNuQZPAs%#z9W&>C zH|T<>U8(#G+dvr(w9@QLDnG*qP=;F#O@$!0&V#!Hkyk(qqOKvSfw%)jp20NzD#XJe zhrWUt5`a(y%^>v*4CY^u@)Fpr1cWm1d^h?^v)%@X*=!5}ARiU8a6a{hHc!mb_!+d) zpgomiY5WZPKpap{MI)V`K`9;DQ>jkpXDChwO{>O3n50Jn>tfh-1X!RpTDXJ`dk z3~EW-%I0UdmJO|YVS3mY5?3pFu4b>Km9I76yhyaJwi8qzB}ilw5v>gj{|G^H2O}mM5TE4)%>4 z)NV!w1Bf|b-z>=GXPA`>_09WSeumc|18<-k=zwY<#5W#L6ImG&Kqh|SZSsQpMl+9} zK{XHBE=tbhXNb>(`Ua+lonZk;&t6sokRFh4=H~G;%*^9wFrSKUIRmQYVBds6?Pg@S z05J#bo11z343|Onf;xN}`TPtj`TPv#)#wI3K&&+ZMK*(J-$Y2ffU@vfFKBXgKqN=V ziWKnjF=3 z$0A9Cv+@L}6sWleS!uQ{7!kxmKG48WV1Va3NVtIuK?YO35QJiTm|_DY#o&;GDxQX< zI0vTK0ihVI3^YCn3g~x8if6(U2VhYQ3d@*eh%-P(INXFO#(maDEQ=Xq5GQlP_Il9T zItB*QvQ&tEP^hu^LjCN3)VPHNFsM?$g{0IFrZfPd6uwdol(6nXH!*<5(Ly1L!NCVQ zI|JlVP=`6B1Y$SGH3o($5H-+%fUi_zs%J1`41%mzi(r`uK1U;xW#SFcrs<$=h<4Dl z$a9Ex*t7`lt6_Xu%orm$nOCfU1b`W1BquY+YzT+Jv<+$`Xc9%t4;mVZ@r~fX0&Rr_ zZ9Zo-g6%yIfgVQ+3j8pba@^-nSfdAiE|UIfF#WjCpRh#N--e|B8caX#^Cv9O_0LDr zFXj*RF7ERu%+dAlK++!u)1R~n5}Ia=A)L%7mcTfH%v@UN`Y$5sp9a&9`}`42bp2M) zW(_F(ufg==KL4T!UH<{7e$etkh5)Gl1CW*vg4eNvmJhzT4@qkvn;c*&ai3HYjcyYo zv{ePt-vHB(`=pdObp5BHgCwAAx*n!~0&=erW%;55w3`i5eg~#}0YW*XvH)i`2GeAu z<28Q66hGJwDfSpli;$$H0-=GV09$})+K41=36ov`*Uf^o_%Q+|odA;UDN;b15C)gS;GS0;Qu+P?rnCT2utGuw ztds+3{!=^%>gfc8snD|wK0?nAw$)}~u!AXMz)-dhy3h;c#uS(`1B5cj`3cXUsz8Qy z!c;jRRDtH0OkY4(fq{%#4^#92kz^r8vF(5)SCCQHV5%4pK7~4e64Hd#ADA)+cmPAs z&S?1zF$`p-MldWa5Qc%Q1QqF^>S!sFT0fZD22`~Srl+8)K+Y?Msak+g1@fu+2P8${ zq;UYD0OEeg@{j+}>mHaH7?PM77>~0_EDMD$|H#SbXNb#(E&oVjX4nz}UH&0gz|SC7 z0A2pkP{7YnRRCT7@yr0?TSf+lWXST5#1JM1C(v347oHME2ADi6LqIZQ*$3i^KA0RQ zLjp(+ensC}=pZu4zhJLCKulqRTXzhm{|q74f&#fG1RBT;7LZH`YNEi~MCQgu2&G`t z1h6TCEb+Kt2T{w$FahKn*b6)M?oP!Lrx(- zgSo6d#9nyNC?Gro2^w=Rs1i`nfc@)$Py(*-!6Q4M>-yRcF)#?EFf*{FF)_II9D=TZ z=7t6>3j;$MGXvuZHkB7C&=t_f3i%mU6!Jq>Kvxy>GuRb_#?8{08Ne%`P0IKg7|Nh4 zpsg$U84N3-E1)-3@-wUgaX>4eg{t@&_^O~Qpbw-oGdxd*u7LKd;%D%vg06s`U&YTb z6T|_nfc{X$&+rPw0j+>`tmbF1u7<9Fo>a}x&;#OtRzNe>@H5;6aX>4e7uE7JwADga zKtHJCXV_B*T>;(Lz|WA{09^sSy^)_`b|Z8J^y?;mhKo(m70?Bl%nWZLp(~)pTKE}0 zHAB}6GwVU3fs;WX3$g-wMmThdOiL?2LqjWciOl|1eullR{0t5tW#A<;FI)K;p0+}l z$iR%@W^l-YERo3p83S4(qua*MpxMUHU;SNZMy47u%4UrlZ2XPDd$nkvm^W&rzYZ#zH3?sllJV8*aABxFN; z^jhgP%dK1MaIiaQ93A83bGS)7rt$ z(A)uC__Ml$pJ63f3uG1afox`mhY`?K(6>AI87_A4Gnm?ag7^%SC$>dEi;DtFcyR$< zU~Ik@stTUD8W1W#tDqYYtDv)x=FQk6p$0BMCou3Mcow*U481;$S z2;zWNpU&#!XP5!vfL5O#>f~oQ&)ree<`d_lg>oHoC{HMa1$iJdmnkE--}wO^$_$W|*iWI(VPgo$WoBT3 zt;BZi;b(B}f#!&;9)5<59#AG?fUXUe(1%#e#L$on8boE~d=dkVok>0X3==>)m!D){ z*xtj>uoc7s#m=1`eui5h4k&h5difccdifa~Kn5VzxWf!)VYmP?7#1r!z5EPXz0g<* z?B!?h2WbT<0j~+J?&W7F?}f$+%m_9Hg*-^CtOL0X6f19f`59h;jG0ix$ROCq&%oaY zjTHr`hZq8&V%f*fVBW{iU;>JjxITV{7!U^(E6siU42^vt_vb;^1h4DkXIRz; z4kd62ss%NYjo|{wNLa{<^z$(RD%*qe|G8h)JfBX3v zeuK0=DP&|&n!wMXFab0UoX^Yv4q2}W{0trwpdkx0f}LSOJ|tv0KyCwtY}W*ShK>o) z^uB%qKf~Gy(2xy>dWeDH14t7rWUo))XSfQ|01DYZ6Zjc^fjFR$Rh-DrAU_ebBL?J% zCq;}5J`?#FTqc4;2^_KsP$StG6bg{i?52tQ3>zjwL-zVaeuk?MJsx9wWv{{0x6VIzcO}Z6@(ESWN;2LIJccN}0sZkTeNe7r~6-WM}|cUd$+U z4rC0dF6y4d&(J;zTEiZj#LsX9WDH0dxQ2Zl;RDF+-&uG$6QNCP_sRSW){~)4>;;9)4Dt!kCict8{0z4zLz~zg zQ}`L0ra+t6f+molU}Rt@f;6#@#3MJcVe+gD0!8ReY?vG;g91nn-o&B{< zzJfKiZ%yH6xH1J4pGDB7wm?42`x`(C+Zd&8CqNgN8%^bB(3uKtYQxmAG8_PT71q>l zp32Wq3sM7WYQxlUGF$+ufi+Vvf?y;2Ki~wW|iACeg>CmprW7{nw0aV@iXL1 zgC=E|G3*Qm#gJyzOpr04q&#^VKf^?jF`#DEj%oZ1+d#&El!24-gK7K>_oji;Cpanl zK;6U4kN`3W)~sTm&dpsO$TXVFr5djbU*`#ZxTTX0c9mMtX>5T0*WSq zq(iZSrNQyw#twU0D4yNb;k|L0Gs!I_jeTFG|fTRdyT^EufiDYOnFj&LeWZ?1n>qv@h zVTu%x6oIT0U52nO38u&aNfF38XQ(1jc580J}7J#z%NjB*jsmLp-qo(sS1WiX?NquNKKf|8s(3R8*CD4`B zqBHmzxMx6DQZvltXZSONpTYDrQo!V=LWB4Lyhji2%bWW_0|xHW3vdM?&`~<@{WqqM zk-W4IW?BG3F=%Xx!ITr)9RP*SE10STgeuO74D}33Tnvmd4CeY!wV>r0;6PdcRmT9S z3++uIiJ6gMLJ2bi<9Rkg&J1W>=rxm{!E7e9E^H`eW>8Lt)`fPn_!-P*LF>W=v-lZi z&4Sj2pWwzlD23F87t)aHLYO=&!-rDzx)3JE$-q#?3?5r?;wxojFu%DG;zW>l!Cp8Z z4bQcZLfV7)34)mDK&)@>WpwTv%I#z}WATPq|z?Rwk3=JSP zpgItyhLd3dNDZtGJTRM|Vb5%S26G9z3SU_gv;LW0BG3h6Xaupbo=N}xdjUb)ZU ze)13l!-Xp!zo45$Ynd5VOk-kj{C9|f!Fd%wgZ(Og z$dR)S4v;uuU$a;5uq#4$K$iP! zIzoKF%OKDOIcj!aCh~HBhhzKi60P*Nv& z?%V=u86!gjL_c`$yyh4`L)kItN`TYH_!*8L<7Y76#Exd*0#pN`N6oe|GsI*;kD6sa z&drs^a=L&izyBAWD5{0zaTpo?gHPxCXFpN1}? zu{guepmzqk#y4TP-zxBxYgnZW^M;%DB59H?)!&+#*;pM&})^&CG#;yI{q zV0u^?8bEsXvg(2KfP6Fm96!VCbNmeE`_RkR22{(zzPS&zn~`Ay#2m11ZlB|4xC*it zwE9EqJU@fld42}-x#$Kapc)AA4VN>-&#Vj&Kqh|S^~;6&CgnUoL&ABeZ|0rnXP9*! z>Km9Ib_Rt`aG3sq`R2xXeugU`%k9xES3tEK>>DYl-HZ$Y5Ocu35xKz6z;^)}H^~?H z8R9SSGnmVv8_0laAcJW)(sKXeTxh;xK+0F39Q6n~$_Hu#%z!C+zz$D0;H57AkQD8O zDf)n<2(&CS4(cF~NiSfE91xBIFH8son^%jZR5%anvH&Edkir3EYArMgf=so8DP4f1 z6uvXSd;^kFaPHrLqzpXA4BBe|UGBdOx&WGqp`nu*d?9E|5ws|ne}SK2CMdi?%l$uI z;AeOZ;(&?*my7%iHW#5q!Mcn53@a{z28TMKMFI0AeukeHp+&)@OZ*HKm!L(#!OQ#% zOD{uZa{ql z)5Fd%0i6LEeFTV5~$sb3 zvhy1%*%-__k(7Z800F2H(2xq~P}#?gkdS9*_|OeGRF$mwCj^BnZ^tWw>SisD1pa*iOta&kX zp@07!eunNl(1rdd@9;Amy~EF7y7)3g11K$s6+=CKfE8Z+f|kb~LQ(_v)&mrI22(re zYG+XJB*6?>fKUW&K!Ms?*5@Jift2>blzw1?+lM#|(=->V6y&sxFr^HLLLanzdm&T} z$hd1TH3|qd;1&KCkQ6bNK>cWdqzGO%oBoC>1=*}i-H28_@H1vCS6O*2U8 zH<(fZB&Cpg3uJX9(q*<9rO@zEKqy7s0Rhs{0o4I=tS?N5140Mbu^XX^Kwaz-n4$!P zB50m}3{?g)YX(eN140=n$i;6UQq5kNngs|o;AnP3QuG3*XakZWL^M}Gm4fW#DTDg> z075A!)vtl70RuDXRDQ8D#H4 zcOtgm<7a3DaX>o}Z`|W&xO5LR)7}ehnrPnVXHdQmZJJED&(BZ-;(#_KpLxK~uSLAOZ}NEph3In5kJGcN6@AIcOLOG+<3&#VEW}WB$a@I z_E9-BRv)my%N9`3vO;SGkQ#7cFdza0RFiwGDqv)o4PDaB!obi6?jBtPSqxh0FY%b4 zLFh5G-pzc>&yf5WTJOU2urWA*^z3D=2k8OTySpCqGi-Ux&tSe6dbJ_k?gc1rgB)DC z3TihaLjlAbaJ|d@gr9-+3AEmgdBV>S_Jp6oycFHQ22=wft%!F}6PXwmfK2?%JHHaz zidg-GpJ6%3)a?a~3{Ri%Gdz3(^$ko93&R7Dp1rKTAUz=8$Uo(0kbcU~VE+CPBDBFF z>40iExE1jSYBwW;KtG~Q6#bN+A@nKKH>;lVGb{rccmv%)1ylnezEOqFMzbR&RJ@A3!yb!Sn~xQvX?1 z(B!IsNRF_)30|ql4UKA0X|xljH~|_!45nsC(l=nz1#sze(3}C%&0Gz&>Ht(4)Nq3I zcR>BI$4E-`U`j6_DTUM;a2-p3DnfU;*xDe7P0S7XJ=>jCh zYBkUR`hcVu>}#mv7f6Z&VTuJ9;pqiBln4qUb)*wwYhX$hFqDGoRGl=0dso7g8bF(% z;M*plcUFR8DFaFI6_{cLgkneq017bEqs0(&L1SM(AWFer4}q!yb#l)@m*|5IlQpje zdmrox_yT>%()=Lk()@Jk zxR>akL2AE0gDEe7w!T3L9K5a)8h>A)S7U?LgA3Gweap$b;UD5YM9^-8K+t;dX-GSG z?O`ez5YY!aX_sZ<1JG85J4niNV9FbiTmel*pw5En1f-$FZkS@keTLOYE2>w)q!Gu- zb|Fchgh?ZglPy9zN9YAy8n&9-yci-n`k5IRW!XjNOhrDn zCh$2wgXDAQu{BR$@-wV`2|c!^@(n+O;~VI)HG=Q?8LqyA9$WM7BR|8YkNl8hYnZ?C zGyMGmJ+`LpD?fwZSLm@dFTV3LJo*kg*KravgCpqJn#3Rc48}j8$JV6%;%89%1wFQg z>n}gUmp}Xrj-X>}^sgUDq`WleOvtRt@XL#}- zT2a6h^D_iY1y@%#Ahn>1!aMFTtTQX2r$So2tban zDP|C0$Y&5>Fc(5M@PQzTfso^CHcVw^&}oDoU$c=xfMF$r0D~!S0>o3GJbkPIoPxo5 z8hk;dX%X}=eo$%p5hBaU93TKU9jX*mjuZqU2CM}d!3J?MBaW}xh$Ib8CuqmlBthN5 z!oV;Ma(s<`E3~C3&M3gZ%P0UjzGfn$07Ey30~*A7!YIIS2gCuj6up=P7#u(tWB~a3 zfwN2k411XbAZJ!AW)@(W$SeRkv!aAWfFXfJfWft^fDzId=z-eL#4uqRxS>|n1Z@ns zu?jFau?j$rt!ZEtV5nggVDJE)RRPn(!f*kkXD_P;NDnBEcd-gEY-1H*Fi${VldgaW zJa}BshT6@@z%U)0R={!nja7i*1IS*`aE~jS0D~i&0E4+Hx`7O+210!E0BRyLg8|6I z&%7SZP~X(E2{2T%L4C86O@Lu58`L*2J**4`AU%6ozrlR-nN5JK{ zlLFi~@1b@xGAw|Y1NMzRy8weGJ2d6iu?sL%u?sMm3!odg0M$TM?fI}iW?mc0R{~Y0S5C;n;^!* zeUpG{IXE9`LG5N_aDbQt_Du$d07DW7)HmBX1Q<4h44jB=paZIb45ky(Ay$I&lXVL; zlQ`4KPIwNQ%I<2-v(2NJ?+R zlukfW3TfAYOsz$_K$Wc(>WK$PO5vuO3qVsV$SdGn{{cxEq=^MtMgZz8DtAHxhl!zJ z2ISZptxjkW@R>t^;Vme7uFiZe(Kt;f7P639eoB|9EAOpZf zfDM-bgBcgJ2$;f8&g4)f<5CAa;oZLkC1Q_`Epvf(jPkpz$nV|t>;%DCA zcBpT*@Ch(%0GSHPJn#4f7+&!~eFM|O%5VUrXD=%wNDs(28vFtbD*OTr=4~u!zEME6 z9PFF7P`eo!K0wR?`zD27fFX__>YL5{0u1Xx2Iim}$bf1f#5ZDHkTk-|pfC%35r|?3 z)HiSW1sGm}Oa=KyT|j_ASpe!Am>zb91dyJ+tmk3ANfZ!Zh!qfEFy9I7s=$ka1Bg5c zFW6L|b~7?efS3dJ&0GNihUo%O-@FkJV0ZyCa6Y<$3s4PYFg*`74U{!JI-t2|0m9GF zF|87)K_F$hFl7x0!@%QXZAgkH!4yqEQUt1??Vte+GHEYN(E}t!;D#;OykI1yFJMYP zASs1(qClo@LQ=}x3H62p!W&FA0u1IKkQ9N7fdHri&^QrjH2Y{DBwE=R4$OiaTXUfo zI-0E~D8Qg3C;%DFJ|rl>umi*ajb?iZ2{1T-Fh~#hiZq4U%nW~eprhG0gajB)2nj%r ztx=l*v4Dx8U^Zklo3#r%nmtKafT2fN0CH^2Ltz1i+rk12rku|p8bB%H3Cv#%yvWs^ z`P!EVHDGTkpvW_r7DEqP00p^07c_7l@W2g$HlIL)tQJW2g~FBcA(Vnj-UK8?l`usM z5Q;zpoPAI=AUjvX)Eq#lK^-p!nYtIM1LW27FdYsE9UxObLe+pw{Q^^yfKUVOA1XYD zga=5Gd^gm)1xSh@B|gYbZ>Um`oz5_&4G5(mI~$PHWWd!Rf*3rSu@0&TG&I}~Q?vk~ z2-;D5096LEZ!=8U0faJ;eIhRq&c6Xu^8ld+>_=xLMa(@=KYl<`gz#f2R4K?#b(m5H zR6nkSssRO=4@`{$LJio?8%T=EVTufp6d~-q22GM6^A^FBI$$^tl;Zv)DLo5Q8i1q} zQjLRFbm^j>K9_({hB~AV+Q9+7AZ-FP=`%AN0A)B%X3jEDjs{(jrY9o6pd}&zIb9_~ zM1UbhM1aBcEp(Ov6k4IZ(12Zl$Sa^BS0U*3YmgdnhC6^F&tU3~{m|N1PD+45LJHb4%9Rpe z$drQCzA!y(3<7h(EhAr$9#C6irIY}}VkrRz^GhEg#)8}jw)+7$yxfD=zK@`GGcq_p z%mLTFzoY~hzJTlnb&@=#1sGhV1sKfdp&NJr)j)`E3>HAFWnw4*nfRGEcLLNm&C&u4 z_0mw^?3ET^*eMP54NMOU!v>I^y{yt8Js{tFmlk0746@t+-SP%h%fT%pJE+}^3=bgY zfPG^uBfy|518qw*$p|pi$p|o*OQIW?fNCJbH|bClSs4W8fm=q_6QRD@BO}1D17s?w zW%Nx(fZ>x2)Hg6a>{eyJZC!wu1~jgl-@Ms(}oqM$n=IREA|tgeKPnL~>*T7fdXmtju8gA6g`U z6i5SY>hP^Ao}*+|lrFzF3YY0%JQ4FiMuZD>XY zSqIKc0!V=Y4mr>|dWN6SVKvD{6XM)DG&m$=ffGOR8p%gTxEs>3IKs8Kh0#cI{5{jSzk4I9v0;aS8 zp%i}X45(8uBjVFk=J{dFT5hMg)~$DiH^L^dd<+!lV(W zh|EEfPJl@xP7%pQItQd4E)6>i#Jmql8k`H@Cx|dGnC?Ydpne>tw*h4$33NOKD20k6 zZvlfTeSnlg!9l}Z&cMcCdVU`y7(vyTo30^5eOe#m(s?`otbpXXA^Z7_>z~R7vFa=b#y5By;z_4K+GlLyydHRDx3=FJt z0t_Ez1sL4l9%5ivu#lPI;aVmJ$9IPq81BglFx-$6fGkhEKg@L6JR)C zDgarYzTZNCq18fw!4b4P{id}5!$E5S*fRAMkYRnkD2PvZ84^}PmZ_J{fYzKhZ3GxD z+d$g^8nyxqO199N6Q+ru;lN68t40~52hH>k>tfz~*EqSjEi1$jibhHW%82o@gh)&}s)A=9jk@V34$j zHld5`1sJkG98eSbhP?p8IeX9;-zw;WkZ1=125$#w6WZKSfI;37I?V6rB*38Sggnge z47Hz$L0~m_m_KnAG_Hl61sM39p>gf&EWqID42^4;9u|fGkeF~TpxB8VAud%Jy#>Yi~!NUdWn>H5#h9-~zXwm|vhn3+2NY7r@yD;Aza1mhG z1G3x_Iu;D~jRLCW;FLQbYBwW;!Wu-%{o^9Q@C{@y$T!}u0u1i10u1I7=ms*N8VK>t zDX5983;`e$zwrKr`KHxXfT7V9>YM$p0t~xdp>YG#!_F`Pq-QVdYLFgK-28MEVE78M z{NYYWl7su^fEYYs!{g>A)NV$G0}yk-abxNxz@YC2&4(>+0t^jq0u1H{&<$LGY9NE@ z1n5LLC_gF90p~VO<^>2pg9q7uAgvttg(>=gFbbOKKuxL^sEr`=ieO3`kd%U2G7FFt zO@}F(fTRdy5(Cl!PKRKM9v~?KHw zFx+tm^`h56ivVK}0R~+UXb~{YLx7}JD9D)y%{)Bb0t_79(B$UhEx_RB4NYz^J)8^+KzjDFN`dr%lG|)=0fy<`0u1Ki zTxbL14#00Q|%+bQ0@cu%~l@)hK)W@-@x>+GB|+r>}7oc^UZr70fyHg%U_*> z1QI;+G@x1zE(*>sfS3dJjkd1y{y|nApnXS4L<<}6+Zz6 z^Imkz6;Le)`-Wv2#LJ8f0_zb4TZ*3mL!2MfH=F$g7}kRfEJinw0o6bT)8$apKv`FR z0kkM!Kvdk&Cio(#K_F#OFl7!1!@%8#KybOS9Z6{`Olbg;QpDiAAkw_R8ko`r2&K>_ zy)Tlo(=cTlpvo9bcXL8gG{|iqVA2neayV#+@GO!da1rnUNdb84E%Xh3WvgumGmR0igpt4(^AvNpcEIQGzJ4H%yzLYCu-+gsEvjr~w!I8<7+} zfhn4RqzF<&fGU&6P^BP;aV&=VdI3Tys4F9mlrD5(Y7QXOfbDccQWODGbOA{b!p=gd zQjncBFr^O=N&7=z`ec~Bi7|MLI!8c=+g8zLzJr}qFP1(1M&5A+{^CVggx08obGWaf+q z178qyG}w~~(1HGA;Q|bY!l6OS z5FxgCP*cb`*4NMOUgTW?nD}V*02jrXgkpc{_L6)C+4GAQ; zZysP-$F~=1HzPv=#2m11w4($VRHLA+iK-|8hO#ID2J@}x1|C2)5aOHX3nA9BGE4xO z_=Q(xCDb=tq68Q=fJ_CqjiLk?UPVED1JlFKZ~>%eFY6_kZ#1F>7*wJK7|cu2EpI@z z92_^_pmsAdFl+{g3fMO((EB+g-M|D?0~t)yphX9$U=3UeO|AzJ zF$k$Op^X%CXpsO?Tmw^_fTS2w3WLTde2|nbhbb*UQVJfl0}X?lnn4{2GW85hsR6>F zU_~BCiax>=IUp$l75!aEiey$nJ+lBw5yX9X{dM z(-+9K(_u<4Ae6#~`$0(~6sj0B4z?Ad7@W!=C+Da^yQZMU>tCRs+l{_bnQfdLNH5PZY__!qCUL$e5I*uM;7B)(z)Id>5;w-lzl0TIGztIU@{yOyA! zy984%fKU#0J#3aB0$PuP2LAuR6o0@r@SlJ*2q?W491fh!i1p|bgAwxrRxs%YuyI1u zElARlFlqRza?|HXBl{IFY4~b(^KVGf;GFPaC!|rpz`$VYi8L;A0H#*~DdT}68*-q~ zVQ5Ig3-<$vU;&L9nQBEqf;!_F0|V2Rry~f`nC|)))hW8Dk_T^OqSA4uk1QsF9$wvl(I} zCvyi}Z3rXiZUQC_P1xlG(MT&WZore_+1@hBBm?{P&KY@A%{ZK`q&{J6t z4jfKq1%x7qQEQ;8Kt=_?R5_rk0u3>NOiY1JXn{;DfvG)!Pz!3?)*-2x1yl0?p$1|r z6Vkzd2Vkla&{atzsd@rawE&?CWZ!(Gy${SAV7^=qiCzZNbx6`mFzE!CwE12nX-G<4 z2Gz-6niP#lIGHf53P{H&fs0j8^VZZIdU87`5c^?D7a){E4zx;yssaVyR+y>=Bvs%U zthq=5cpIjQ0Zo;;0<=y7nFV&Z140ETYq;|sW?(Sb%*OeUgFU8bl%U#2vL}j3JO?htD9%e}l=NK*+<6mIvt<+XQwy^TZnn`9siy2SI+z zgvb;2+Zl-80^!$Wp!n@G)JTxuCP9qE?zb%H$?hP#pF$K8w)-!{?gH#~&x0BXvRh;` z*t^*5h7~Xx&_wt{n}xw0rhEdT2H~D~pkfLOhk^=+f|?m)Afq9JDbIdLVgOY-%`hzj zh}#Re${CP!a8Eo@3F9)D9ykEe3p&&JFida8JV^0~dD+N5HZ#yoHwrr-3K&dPq3hg1 z>HHN;{{uTnCIxS!y8zm%l>t=-vPNqQG!UjDA8d?rr^#M)YtA6$i9neC2E>_ukbGhK z07+Q|OxXeqWz(Q7L6D>8!;~dpD62!NqW8g+Er69xrk#O^D*7%=`T<;e29oq2n6$zQ zNXRglsstf)OK*jSh{8&kv^A2n6-+t-F71aT9SM_O0GBpLs^BYN(huO$en`^OVbTh# zpmv*^W1Qs(lVWh!JIuh4u$h@bW;+vuqyAwAhRhfNhV&Q#2Gbr5NJ;{=8efAAMY^8d z)Kd#03o3yHwn4q?0H0@voB{bL2cig+`;sAw2@u&6XGRMK!<=0MGoj6 z(7mOgfUX3~hH^3=Knv&!=z<jRXbsZ-|lD0vcA#U4tqI z1-HZwaL6!PL0WqZrjL>Ce71#1ax!0l`vKAq`3_YC%ET!!MGp{)phW^7v`7Gj$3&Pi z2DBO#)PMr@e3YPyL1ylNDONyJ%wTE+ZTEuAybDtnfUp`o1>px(1Tu?dC)kIa%n1lZ zQ1|6Rm4VDMgehx4QwDQiI#Pox0;YHYnqmgiLr8mF%VEkMz>=NmDWsBV8cbRN*03_Y zi6p%hCY=D2Hh+O64NkNRU{VaGLeMe*nlryk_`~vC~e@9ZQwF??P z3+&-)Stfp{1SOSCbApqUj+LX++aODmV9E}l zD>HY4*1I5O;K*`7Ps|Jq40$UKFfcT1VP;^QBihBxV6y7~14C@A07G!B0E5Z#0}Kpz zVg(p3fjCzVFfi1|2`~i42{4#EJix$Em>|HAnjpYn^6mfw181TD!(R~R_W=fm1&IO- z(-H+3OhgYdFi0i|Fo-4zFqm*0WMGI*5@3i-5@2vqKFGkZ1G)f+fnfv40bcApCKC=a zFf2|IV3-Ti(0q`AfiYQt;Wvm=c94M~I$3}rGFgDZB=aBxLtnB0Lj#BtbC7|-K1G1R zFhzjD#Qz`z1AnRj!$T0q=^z8c_cQ^9uW14dCZ-1&7&Oua7-Z4~7#u(rI?g@Fz_2e} zfMHWQXff1528N&v0S2!O&|;{A3=9`C1QLFgRW~$iUE>CBU#V zQ-Hzk&OrtS(1?fQ%YzII;>7|Cw~GWA9KV5#Efru`Rw}^Y$b5)_;eMF_!|^f!21kKI z3=Hqe1sGnG3oy7F9AaPy*v-sf(!$K(W_k!@QbV1i(;)_ivI+qPp9%p6H-E6`gj&a# zLktWSH3AIhss$JvGY>H^L^TR96f_7hxR)JbU^sA?nc@3hCI-jqLktXay9F2$y9F3b z!;eB{WkAv2z89M24*Y>{y=R{Iqn5$65lPirn5qZJsy@^*n65@rbs46L;V+U|FKQXg zPn<;92u^Sc2o)?7cT})3Fc`BIGcquXK-94^2pnN%VBF8f`TrmjgNa@-BZF+800V2E z0E3BAF(ZR-zW{@2zW{@YSTQ3*?F0da)CmF%#&3!l8RDQOFfs@nWoBSuWt2O!4|>?` z%!vXFQzr^AfUlN&_k>Tn@0fvhpHK4<8VQM%T3_xmNhusQJ5@6t+ z1X?S91mapyID&oEfCwE%1JL;w?pDQ&3<*b>8Mf?aVsNxCW@PZ6B*5S~Nr1sSwwRIO zKq$lj7B~xZ{0~SY3p=BJ-hL(qle}U^hPjgj7-miqVDN#dhpF;gjARHqh9RtL1WmRS zGcr7$B*1Wgk^qB0x_$-*2GhU65I2Cz(8>Fui6H^*5y+6v9(12Nz!ijmeCqC7%*e3e zC^JLO0VW1VzhXuP&B+1`s*?p6j6wcvm4Mj6#2|2tnSn)_(NOIG)Nd)11sD=03otl< zWIRFsfhlGMD~9=D)noyNWs?OM0zm3O?mmm;Ztnw7cRT!sB|M0`U6(;DhR2WsTmjhK z9-u@wBLbp`lfePxxz)*0EncIw)Pw| z!-xA!434`FF)$cS6<|=93SC>f(gI>SBSXU_W(LNGY;v-9kk{54O%q`FG!?qGR%xaH z!=o9{wY5TX1Q;&OhOVt;n=im{XdZNJZSW!ihW`tpYis{56JXf847#><<4OUBwJQY} z94=giuB{bcCBX1}C3J1=_tgRnA6G-y)+VeGU~pOks!pylFkD|Nz%X?!s5-gIz!1Ap zfWdJid~NLv$lBTpONdW+7z}Pg*4AD;44tfM-6X(JzX>|^c4dkRH&~oAPD>2Kmhb4CeaxA?Cuv|G@`Xo&jeG@MKjV)N)3K4G?p{lU4DX1sEbX zLno^?Y!+Zx1u}5eJv0Lkpc)8STl?T9Geh|i=-OK5EdmU`Hw!SBrdmPtf;uhyN5F|4 zy!`{zmIq}TP>XO{5=0FsaoIrBa54wHhdUaqA&_O_f=V_9Q=>=+Q1Qu-pv}S%4O0wX zNNcVghmZy*KKSxm2Jjl&Q&9J?F&Nx}tg)>*0iC^0-y*;ezXiI+_Usk`hT|X(=qL?^ ztpW@ZTLlEwhAyffD8c7USHoTz;J#mboSbJn*f9PHs~5#m+b-!2HTO> z*nWZ9&&06d7ID>YK)$0u0qVp}x7WQ-I;rPN;8SdRQ42fb{HT zbp+`F`9^k^0E6T%0S5ETg%F3reRJR)JTbt1;|H~yk>LWw9I$U9cL^{A?}Db_6}to& zmVgX&ScGQa0#pMbzNv(o$jZQQ2fRxx@i^2sk9G+#+yj{knmm@-Ex;hL8|oXF9(D!? zkeq7GUVv4fV~#-2x1E zK?WW~H_!pqKnBwZNL6RYad58VWOhKrAar3}E7TxR##;+hrhqUE+@D>Dr05b%kpYq- z&^#j}G=M=S{e>xNKvD!*cL(ZgDEU%-$=&(7#uJ!2x6dxDYViC%~Y-4_XK??H6Ep0pfs`u;?BTVBkFfUBc3S zP=KNQAas@OBB(pq83gWv3xi81p$X3TkN|`JA!zo=JtV-8c?g=|V0t(i0zi89vNnM9 zfD+v5LjnxT4+$`s=RbjX51xG*P|Is@g4+kRn~`Ax#2j#fdwxiO;UUOgP+?$pSb)Lk zumFR(D7t|Os0Ko^k3%uUT4sg|AQM0HE;t4CP03*ahJwRT->f?@rByW$lw4m2kaY_BLWO^N1)lK_=o^Q{t*EN z^A+d@GN2j=@l6@jL{^3ZkcnS-^G-v3v-XGp!%C2;pu*t!5dntBN1(oe>0xKs0MfIU zRR*L7KpV4b5;15PpVMtmo!Kl!1ooufUWwEQJjCLuLe^v!|fU z#PJ+FA+P{;1)=Gw#}MrxTYkc|BisTmOYR^kk~;%+$^;}upj`hE8b2VDoMDO_5bg!f z>^VTa4N{Z^Qxt$u1ohMkBxO@!${rwD2$|FdEz;eKq!dzuASr_sG>E0T3KbCFvM~tU zhb+~7aS^&y_rp;EhDV@i0xi{@drW|#{}^6V2KVEjp3r^h3DXRukp$64vFUfU2egss?1~UYME#2sNlHjzKmre1|agAzTN-;~<;gLe+pw zWjhb^FG3A?<&@2Ph(RDl#xO-65Q@=G{OF$2P#AX_g()qo7FfvHhIr~%um z^Z{Y(N|+)8gd!AMbD@esww{G4c0ecw*}4;|24w3en3@EH8nCUb9}%|7UVsKj0K%`3 zCO&wvM=+97f0)t)gi_RH!l3@c3aAc{D@$NH8W1`_#+rYFDgrGN2B-Z62nFD@$^bcO zIs=*o*cl2y8IO~hQwWr^K}&W`PYN&?o`kL|Ej%f}kbP2s!Bl1k#A_hiKf-KZfXFkT zb)|_&YQUBsK#^xK&0YsF1XTD2U4(|ut_{eA?-Cd%keQ2@8C?1@z)RoO?GXK-NT`MB zZ$MbWR9^wgIiSTNSCEvhf+;OPC`C>H<_jM}%muj%?C|wC-SnFY)lJa0mTVQo1U7~R zpzxGn;oNf#+SWRAQh;F(C_F*Sg#v+=b;S=m>xEU2OvFrSyMrJKn)4g z3jz#=7X%p0ozd-n@Csg>!W$BCP`eo!1RjB#SKx+3;ROMP>a&RMW3)F5#h7AyNz`j{^QGj8|MW}CnUKC*X3NkPV z-M|D?10lY-3pJ6I;Q`3RFTBB5p}sM`B*3753EE`My(GYpc?s$pm>zZpg~#A9Wd!K~ z`DXbg0fxnw1Q^VluAl{_0;=U;-@Jy}&Bzb{F$e6M$Cm^c?t<(EHNcH73oz(i7GN;X zMmLZF)j$T*lh9%dQ~=ang(lYoL~?`{u%Pyp>o$n%KuTA_lrkVGg>=9`b=`Gnxdl>s z4yN?MOL#&9m8_;Spg9Gk=qF5(0Frr-#uI3GG!*I&kW#s8P*;9HG7n_wbRQW8)Mvu*l|ktDq%*OA3(E=HAcZ=E={*mKevnV>VEP$8 zB0?JC6HxrAc_Nf%!<0H8l)?*eP|K?fN%1t8VgZC==w1*|HF^z6>0y{s1B6nzxuBSQ z7lv@eJDB1Gq!u$|4Km1Fr*MQ)=^N0XDL^P?nfRjuJmCw9rmifAV$gV@B}6ee>4L@! z8B8}8LS#W}kgFiF;JO>U;OGH(+88t^XT})BGVuq98v$Me4n9JAMim=_scr+r0MG)6 zvk(Ko$%%qh$ca!RK?@-MK#at<0K#Gp#08*)VsjH38k=ygh&lnO=@AJf5J`UxO#f+| z`tP9Y&qC6_2c~~7PW`vh_1n!wxc?7K|3{qq@1yGvN78R|3+n&-IQ8E}*YC6dVSf!w zzXr~X#*CiPqLK9Pf$3+)shNYdb97HJ*2G3e6VGtkjcc7}$> z%nXb#*yPWGCV3VeW?(RxdYFMB@3H_x#$^Eprw))v^+ zcE!M8>TV7(4Ybz%GsHAlnFKDmARCh>+CWr+Vn^aGEJWZ&g6%Zj2%RkkDYAtrV)z70 z8{ipF(~usBNuVNZ0z?tvBJ3t)sVa`e@EuSiK}FaBh>>^~!~Z~<<$MZLuK;%^D0~=9 z<)BlTAkT2$gZkJ3p$M|}`WDja0wb8J281fe+5yx5mm!`885RLkwgDb|ArQm%L*oq8 zgsp|CN;RfFko!Qj9JTuiLe!>Y5{!V>QyA^D=_H?FlqBANYdc^k^qx}oQd>a9TMye z3?FJ?Ok` z;UfVC=||9cTgm4F3|F5)=WV~g6kz!L5_Av_s3>T<%D|BRN`OK46?EQq&l>@T1#h79 zwx;g{7$o08=WS=c7hni~51qFa|17}3{24xP`=iPjbZyZA4Tw*87z&;7igd7)K>upk*@*_ri(No zo&vSIwm$@?PH@u@wqpm>mi&!WZa#vj;bflh0Pbk82FT_fix@;&VtfQPj*}Ta6>FZ2 zBn|dDd;%9TOZyk<8Wx6t7m!(6jc3q7gWRtI49Q=i6ErWs3NSnbaX=F^{@(-`T)#nQ zX-|9;U^wtifWZM|0C40k{r(4YasPXUHkKcIsK&wmOqJp2ir zpi$R?gbEYGgBRcln&QXM{-N_P0S5bD(EefVF9C+iU(gtb>0x0|cnOYiMUWm)jBo!X zz_9rj=l~;V8w4Kn35Y<1_uWmQb~7>rK+FNh{O4Z+3~xd9g8GL}zXcfVehV;|zk!b3 z!wqymH4xIaxpjr;@?bbo5ONFm77|1hNrNS=V3YW^Qd zDLD5VASr|F1P0#^4_>e#6$J?#CWZsAAak{Yo6^BM=8Pei-#%fWhxS=zP3a(DB1B{{#~B0})-wn~#t-i^3NjpJ6og!S z@Q+E5;T@A8B)R!Q-NDX~@ETkc)IEnLw>8Xy3@exgA$Op>Vish0#w-ZA0|lmslVJf! z&t6s?kRDKS(_j%~P+<{dFu#tzSn9w-l(Y^`ZYfZ^85tfx%mF923>HC#Bo;x)eK*@# z1Q|Ai49rD0Z~>};5Z@etn#jzc@CJM$lFtjMZ@#h!GJFJ?3d%hCtbz>MtWe*;^sq7{ zfb{HT{RQ()CaWMrDytxa`Kb+%$buII382EM*mBn9mCJ%@tjgMGsu4N=6%U;r@(?3;URf($o6_JWFOU3NhR zO?E*B^LBItA0QGwxL`BAkO(mil#3i+LW_b22y4M(Fbt-O8xhJfV9FYhl}!Mxm8wNj z)(%rP0ji9_)C{_27i8Hcn6v^^8nh<^l4U`S=58dVcVS8mkd#6S0#KPD{tDqXrdLoe z96)#!)Cf1vL{bDU0xlpafEef zGTZ}kKvy3Wa0oJ_aR@Rvfb@V*L^|-6nc?SK=rrpu4nc-@9DEMR6}cn6tg zWq1vpX6@h%N8tkpe;yWSSM+i)1i0hMERa9060@fTS2wVuBiINk~eYVM-?;DTPER zsAn@9N$FOY(gg^msIzRKczpoX0rJ%?n2rMo9pDN`<_yH^pjkG?H&CBFKq!Ky-#Dl; zkXfoQWeoR_L(y~*R1L`AUNAKZ2sPk&#fM0WN@0o&kQ6}z2jpYrvk<3&?3@Wx>VQxR zn#)XwssY)#52hvop$2T{G9*PWVTuZn6d~+<0aXgJllLt&I2sU2L3Zk#gSZQ1rx8re z0)!f{o!Ll=VquClASpuFxeTflWM?Bx=>ddNkev^a)GURmd4Q@${yf56*I{ZH5OqK5 z%s6QDJPxV@WHUJ3D zT!IWnT!IXy!s{U#K*k2Wg9hS*JIIN}+yY4r*lGqungf-rrc?!Vu_v z2B3u?_mGr=%{qWk2F{b<8xlZ^QK3_u&M6QFvN05Zd?dlbIrB5LiBiEO$dJP&2)Uk( zja!g`fm;xAH&ZybAVVOC18SnI;TB|A#4X6+05SmFTT$c@WRT_&gj~{fI;9rc#8APd*~ErB)=d-D8C@&R*A{{f(-rq zf()kT-$L9C3fR@}p#htK@GNMG^8u0?a9}i`$V2Mi8FdhY*cco@7Qf@1^#NM{p63^2 zI0>>C)S8eJ5M+=NfY!e-Jsb=TAU%6oJwSRu^>37bAVY|NAcJ}HC5W*g_krzJK(!lO z|1O8x&B(9;Vh*_eT`eHUuv7rrn)oFk$nXthpenk745$V|eDeWnA~VASkcpppGd@Cn zVP2>p*GGqxteFM|O%AoK8+?o&r=>hp>g`gnA5h%z7Ss5BYCVt^H z`vmn(u8<%@rV!LO%Y_6P77Iar1JlFKZ~&xdFY6PSZypK>GTa4O{tZ1S6HqM&$Bik} zZbpU=5Ocu3krftX5Eq8VO^&c2Lx!**gZX`Q107HeWH3Ed0PzVZ3nzYpCf5as7=(_t zf|@Hj(4YY+?SUz6Ko|&B3aS0%6jHK+YQRZIO0U6`K7cA^Fui~z{Tn9z z0V)k?PBEBnhk6s_GKJ4jPY56>0=elVk|I}_A_XKxAlEELT1!^|Q{;dY9FQhi9Rq{; z4kV@Ej1+*R4ALe5x4BGr8zF-D7|hHBq{#{JtRA=!WH6OBMkxLaQ(SMq-yOD40sb#8V-XbR|q0KJjGQf+RfyCJmo_G7X4Aj9PAoNy8_-%=aTngR>EQ zx{QIrSpEb9LzXfmIj}G&d}L-|yuc>+nw6Qs#O?$G!vSGIhDD%4&+r5TL!PK0gN3Ld zg9AvJqxT60hPUE^47)Dm}LbSKFSC(IPN;Z zz;Ikvkl~=LAcN!a6ATP0a)Jy(a)JzwS57c6Fv<%u+y`+Uo?u{@q9Djnq#(%P`0fM) zgSwI+1FMoCgX8ZL3=CV81sP^23oAO1CN>@1B;p z@DwpJR6^a!%>6)?&$Fqm$Dt^xox?F@cF zO;Y#*F$tu+nA=!oA_GLZslYr)+5xE!g{gKxs0Ixwm`;Z(0+mnIFhvItE`S_T^c<=R zWYkKSss{*F+{hN2n<5pF;2h6@uoP?_1A}q>Nd|^wHHZV57#O}WGcaML53wdf(#BI0~`;6 zqCiKG;f#(TgUh8tMz{qm3;`euI#^^(J{B@ExabNpIOz&9m^>+DWXRMNWJuQ)WN-i} zar{@v$S_$~kfC2!kiodF2w?;p!-Q|l3@llUQa^t)F__FPVq{>~6J%i36J#)%P{hcf zqbJCqr6PJwcao*+Xxh_kndkzt;m zAj2FzK?VnqddDY4j10N@f(!@sz)1_7!8)KuvN0HZXJ%l@h9<{eGeL%KGiY+$WG2Y4 z!3?Yi8p4O6x|kRezB4m0a#40e`+3=SWDFf)KdnBPi}A=wffTHp{q z3k@qi28W+WA*}Bx$e`;84dD<+L53hlupR~mZ%`U$gig>hGr(A`umYN!m6Q8FG_-3R z1sSS9rhr0wp`#$fd=Li|+9ww-U?G3ZMUdeLNCPP3U%Lo0yaaJTAur%6 z$iU|cO4}eufYSDTS3w42S8ynTLtYqaBpZXmFQkzF?<2_Y*9RK%D!zgYO1@w{43MhP z#}ra}ura_`>adXi#G-H?6!M^|F~C=l!OIs~dCc<_WSHYC$l!yn1zeFF^A%(`;tQ=v zU@ABm0zi%`W|Z0tG7?mgy!RDkcnLBRRFT;F2{Kswfy$3x%naa)B-KxlA=wY)RIu-g zq3&d6m;f>erE2W)6J+QDD`hbLR=~*61Xat#aN!p-1LJoV-bakg3?>|fj0}7H1Q|B@ z2{O2g7BVsv{AOnO!@$hoC|1bG;N>sKVC65!;HX^4$nf7^km0AlAmq>oap)8oBg2K? z%nU3`80A(nFf%y)D`tco_5hP-Wq9x#a@d0t=&%PD&>;^nIZlQTAh}#d0VlpvMh0_r z^tlBEL^S{!Gh$#c{eiSI`3eIw1Go-wKqv#Z)xisV%oCu)TA=C&tSkVVG6ol;LPmx| z(D7ep28BP&3@lR_1x#ED85sft1R1;oK+VEG%n)zCf+}QWC;%yJW0cwf3Pq5&mj?(k zEDjKacps*Ym7(De#QWg0E*=L6GTaBL0R;n04JX3{kQ&%o7xICE4AOyu4CWu9i$p** zBiI882oFGl!`uM6XAthk280r5P=F`yAj$d$bjcGd1B?Z0zA-Ye%I#xfhP3!10|gnv z1EI;fE>Mu6CQy*U2VDy|SuYC|WLOdiP1Z0K>Y%mhvpV9$qeGDobahvZz-V5lNcFN}v7tca6YF|iRWZN>;WUzE{^!L)BO zB=duU-591Y0nyB0nRoznklt4$Wf3rC4G3l6O>r?(5N6fF6fHnf1nOKLMpCo{rsx1d z5!6EUsR*-9!jwHgC<9yAilpcrOcBFZcry;%FuRGQNR$N{6bcAMPzzP3AuP0lDRV$5 z16x>#q$nPyC;>?k$cNjYia^P<4W_68p$KZ>7pO8&$ghPdTY#bLIMP~`GcaWe+aTvv zF_=%pSoZ{zVlZ852=NlgA^faRpF4bm1y3NCv7#Mbh2r`s~2r`%? zUtwU_A1=sH8!pIT5_W}w;aHR)Lrat(gNf%A28N5Vf(+fUf(#}$R~Q)d5(OC^BnUE? z=wD%AFiaI>P)-$OFj2a~z`&6v$Z!nA5d-PT5M(%;0qPU}V`gydy28Mqn<>b^o+-%S zIQU|?in zV030-mEmA!a5`MT2w9~dm?Ox*odX^1g(>D^aA0I%VA{)iik+FkX+NlnMC#Jj@IxF$Iha zvAKc_zPZrp9`QUu2HrgAbkC$bL54OE2Q=NIlrP92mJe!3GO{p$r+fC~3o@+8hfepL zED&T^TL4{=^0!cs;b|dsy61P1Aj8KZ=!%ppP z(xG-UG890}0sDrrT#(^6$X?JKQb4&NgHO32gE=F*fd^0xWH9YO8Zp1f4bF9(%m)yD z22cAxgjNKg%=ZnZXamA1@Cvpds9hjMiab!07?4Z?&liBrD@0Q215+x1q!f~wLF>+r z&4ffS$kalZ(gjFXgL3?OXc7b|ngdf*fMgzcUIR2oZ7zzwI4uE58Qg`?ncs)05X+eu z7O=1|FuJmE?h=3&1%2g$3~lAmqToxpAj3Nl2eeMrwL*}=z5+CEP{7DAuR@SvN`)YU z1IPeyQ6O6>$RJt?EefVq3NqA!IG~x|)m4HFldGUb!NzJqhLzROqChCk3*4||Vo+cO z7X{LM(BvjqBgnv815IxJHG&M@HPGY+)5F4$0MfIU^&~H}DCn&bWaz9BWH4WM9bzmz z^Dv;6*5J&e3ALM%VFAP(aB@3aBgk+ZWG^VW$|_07$CL59m91E-@KsDNr9gK1wn#7a;uy2lUA zzzT>Y0bShF1`QUFGHwB=vI2x*u$i9?pbdGSkQ8gd6d!;pW-#@Jra+KcfiUR{P-*b4 zKhQc1(=@2tLCOkX$^@Xw7);q7ARImyCY=D42F=WZPXS?>2y&76cBB&_z|}tkR3QTc z1NfT03(yHRb_NA@76!&V7S=dXW(Jd+{}>qb8Uz_s8la2P);0(-%m;Bmi_%gX1sTE{ zL4A9676$O5v<2)e3_T*u42~NA85rc71R407po`KZav;uSW?>S&=RBNP&FXq#Dt)3azLoTSUzO>45|a<3oDq815c5C zVXCzm;mCNHng<9q;F;S@Bt=~?MIVq9!ApD7B~YaxJJ-RKG9X+D^2tjiHJ9OPkcTHEL4P@sen9>G>QjnbmP&FVsx5LydK&S!RxgJT;BbcHMNQw}4zJ;bXka@f! zP=6jkN=y)?phb%^w;|30DYbwpy?~??Qt5(b??aK4X2Fy`Kqy6Bv{=u;V7>-@`BDNR zZb8*OWJ#I=H0d)l1b{LeCo?A-C`W^qq?I-cG88sLS5B>O7Gzir%5WYBAZ`W)=~I|P z6c7#pt(?k5QUlI#4k+>rrvH#u=bDN_!-xT)2s}3qUu$Om0%_Ym*t`#q;aLN`Fd-1s zCx|q_zdEJ`Y1lF zf($OLf(#BI1HcWFb*+L7D_Wrq6VWz7hMyn~s9_S=F34cq4sDopbqF%lbwHP-y@0xd zmBE0Mg@Ne_Z@d^Yg9#{L1v&*8csij0>(wd9;MOU~V0smr#6SUSCk73Z1qhFV0`?h_ z8gM`yK#_;kx@zr^7-C^a09pKwQ&${X>$Y_YGBkiJ2GzP(I|Ugoc0y}im>xEU1t2|p zS#N_J3#xSmy961yy961`+o0(hQ-HZ$uAm)H;-J~u-hL|pBt-G;H zkYO#zKnrvO9Z(H~_@)wSA`=4x7YpbDJ%S8VdITBF-`{~mIXrF_pjr<0%|58zj0^(Y;C3R|H&=QD8P0+1 z1+`X{dj%Qfdj%QHZ=f64fNCIv>F!#Hm7ucgiv%>eK0pK_q^Se${p>=@?edaPr42|* zAzd0!Z{<9aQZJa&2}nvIB_e3RZ!L6y2IPQDm{J9(QU=r4NYZ^UX#=PDtKhQ#5R#%BFhvDOia_Nv3pDycCNWDv{dfRL5xAWNGS6HRNhvt#T|iO> zsT{xqa;CzLh#-!HnfU-|X%INvz-1+aX)}`IHkjfMNQ%KB2UYwSN%3ZwVutSNG#-xfCl(!PRT(K{h)C4hUtHR z)DMLO5GeBYBPp$bDgA&@3Sa#ON?1v85OYBzXmcQn!L2&b;Tj;1g8I|f6Ci3ht}!s& zhNyuC1bj&wcr{iKWMNwb^q`GM@If04rds6??V!mKJsGgqnLx3Q_kayw7Bj{OPUaQR z*%Ry!BSBLsu@ECUnHA&Fr&3@yjND!TaRDgs=fafZKA^%HJ@CIE>Awrp zkNbcMOLYCb(DPD3_RGqGLx7VR_W>Oi==#-=^vA;V<36Cn99_RXlK#0c{Yf|vsL(>! zAAzL*E=)h}14=Z}_18h$DWJ7{>~c{5De&N`0|y`> z18T3D9)pfnf|Q!Wlo}ukRwSjqNOPcZFr^HLDQM^k3Ifn=@E{XgV9G8aEQg$Skc_+# z45sPfU2_9W?}dSQ*{8L3hJ)SNXldtp@FghVIx#o zA<|TpGfde7cmP9>x=2Gh5F;O^N&yjUAeVuPbWnBFj-+-fOsxZ|S_acKP*osb?1HIE zK&S!*i1~RWMc|~-fKUK&KVTMClh zFUXMIFUVki6lyO#XbvDe0|^@Qr%)xJpaJ{$0YV8PSQr=>+}jT^FgWnCF!Y%)Gr0B~ zf-aTb2#rw|1_OQ;2F4R?Dh0;SrPBNR1sN9i3o@91mP&_D6l9Q}D9GRdQU+cs{bI5p z!I2{P=S23;y`GhL9uWIFOv=??-d47o?rv zWQbe{T|itc4M`si3=YC9;N{WxRiTSz_AU}+*u4n4Smx0pL52s51Q{Ga%D@X`xE2dC za4d!{kbxP)#Lytj0$vim8e|M;fsFoQK?dE$f($0^pv9bv1sQ@CgL?YHERc0yHH!rq zsusf+$kapK!_2S&WDsnD%;Lp@3=2VqfR;v|SS-kJ46KF09kew1fiMfhYjx=I=s$}E z8Qy`M1zH~65D4)dGlPQ&3wU|-UNxxi<}VRsn7ah(yQ51484fQ2`A&p|0qncCO9UBS zFM;|FW(+Gsfe6HRogiaCz7tw1$RMy3>N|_2f(&L$K`RGA#()-lrz{m@h+7Kx-E6pf zHh>I*`EKh{L59sBLqNW}y;P9lCRht(dGrGj76wI-??B6=xt9qtFfJ2hFg3pb@fj#j zd{cuK7Z<)mIus1%)1lJvT=f7d1zPVskzwKj#PaAbNRwLb>QIvyen3nD-KREjLM?-- z%Pfd}AOlNbsuU2axXX|iQO|*@2DxrFOtk|-HF!O<=^v;nkeMf8suB>YP}fH%&qlZa zTnaQGRD$XY26IbjoegSZfmJNTdDPoENc-vntQ!PbTJ0tSv4V*~L6il&wECDPGh}IX z-7-Ojnq|wH&(qRB?qMgZv6mA_5r!TKMa~LXg3I1$6l-%m_Ay4WcaI zrPUKaZUim-)m|ycpt%yd{4`*tAcNmZ=7{pi@SYXRfD^?0Jlz}vWmY>dD zDabGz!~rcoJ+xAg;lN7J5^*sW$im;(D+L*zt`uZ2|JeZvBzP#-A&2sWLP%H2j4_az z%ajp(^5h42C`0!>WI~<8#t;BII#&rYw1ael77DLhCCIP_!~w<5)m4HFmq8p*?EGCN$nbj=sPqB( z3bgQDeYGHi@@i=8z${>4_yDp17CW<73o^`H4UL@xs|6YMtp=@#1{nd0omZ;`8J?|% z#tzH~HiiIkNbG#lVumbyk6RV`mxEV+;%jK$>8&vwDpn!%C0_ zQ0!b-Bgk+L!~w<5*ENC+pVxqDZ*ges$gLG*kXQ>2E%5T$4NxQ57z89(5DVY)*9tP^ zu7!s1l(m8klOTGa3*X;CbulwINU$(4a!1tY4b}-V=&b`4q!KI)uAmSGZz+Ho%*wC77dv3iT!x@kUP{@8>FUar_!~un@#0EhIu??VfF9i)*#|?rE)*BEZ`vV$A{0sq7 zNFh6EgCN6%4bYI?zCn;-D?|@;+4V#PNTy+DfU(q|Eh5HGEDCYD&`Rn420@0qAX7j) zl2|qhGB9lvWbi@P0voO@_LEGO4HVHCp*aU5Vmu?nh$lnZY zf0rvlf{KwrKnBwO*3d(4f5YTi85Cq74Nye;8z#reU;vVXx4+w<=L3Rj8gR{!fT#{3 zjZD*9&~Y?Sl@+Q7tp+C`l)?JUpfw}rLC|^}q!?^o19pXwHh2PjQ&a-TN3b^d@y&t^ z2RDN@iO4|P;0vG%85s_M6t*!+S%X3n)CQN`BFG@Q1=AuqyqHh?Db^IHTN&TfIWyuNG^Wcaj2kiiFC3pkO>Y!zgX+6qnN zFcs_!0Dg&9tVhDB_C-Vag zW!sRHX~UE)Ks29NK5)-Xke9f+=f2C<9yg z25Cqt5T+;rwl35B1^Uih`1))H)2Gm$CMen_!L%;;1&dqAfE71V_kAZ!Q3FB|3uG0( z9+I+qFl7@E%D`^j+=~c7W@DJY;fg}Qiq0b`(ts&aKvDz>!PihlAgBAn6geO%0&VWE zgeD}AB5;YofTW-pRHK0xVOz;UT*bmLL6(Jq@g$qHf(h~>Y>sV$3=G?l7hxA{6J*HR z23>?LAjiVsxZyAZ!{Kd$3_G_$7h$j4F37NIyC8#UFjByLhq*KWUNk|*NaB%Brvtmx z0j>Zx0|9QRn#w^Hg0hg02{Z&55Q;e`GSo0AaWOE;Fqqmy)q)mYWW&@dK-DssH$tW1 zq4NPTP5~MtV}R6`)0H5h!^qGe$HKsPo=tF~8MMCqv0aei$#!Uc*&xrtu-X(_U%uHP z$nazbw7&G)Dahcl6Ix%oLN|glGCYun)Rz&a$n_;mo|WN)JbHZzljCGyP+$QM&Oo*+ zNiBvr5fmuk&`Us!2|_9d)5l2XCN!Hu!)*dW8De0@T-pR;8a!MYuqlJol?+}Gwag3# z3M`22N(*)hGR)cu8k$jn)|DDig^UahAcbv=Qt4*Q3?`tu^4m^9hEF@8btOz4E5ihk z7h!d!(Jny-yhKSvQ49j*2GPwT*T}GGMGeP zWnl0+BgnvVMv%e8?Q@;UYHkTKnB5X&Fp<8>z)*NskRkgnXsxIY3xgx*P}^^J1sV3-6=ZPizskT+`9P3C z_kkdT9$l$p0Dg%SiQ$dC^PXrlUw_Rmma65bzv{PUQWT(J>J%|r@ z85ZcXFn|uTb+bU;DX{H@Aj5_i&`EfhVt$4X`ryg)FXphF0&dVHcJS2Ma1vI+A{}N6 zwTzKL!2qluJo(Q0Qjp>Q3+PgUke7lC0WSp^%=f;8I1FxJ0;++K!)yZ#SQwsIfcC*& zWnh@}QjnqRr67apOnr!6&^%|I1vno-SIB^d!&f8i6j%w7+ zG6)!fQ{FaE2!NK4EdLWF7IiOk&_Dw$2Zbk+Nh&f>2JpLfaa2I4R zX!(fIM?nU?kAe*5o#+NCpc)AA%`B*itPBMp6Tk3YgZU=sqaZ`ZN2qU>eH3I^^bzVC zm>zb94In*xSzADQK)!kKQIO#d$Z~CT%O4zrCvbS&tb*Fj$nXGS4%jy`p9C4iK0)Iq z`;#C;`X@mKb1rlP51<;zV7eP=r@(J(aIWKIK7jBuxZQIOI_m-|lND^BiWVS@0xNoj zq{tPfXakZW(27ehsDnTz6~GiRAXx`q7y>pg6G`c8m{I{GrI7U$AXA;7y;6{=$6!hm zkd(qrHBUrR3Qqn7NXo#I+@O9bbV1%b=-O!}1_5Ih2F91noKGB}MZxkMFHz~L58p2phba72BaupXJ{}67X_|%(9E;>yCB2b@6hDN@k5Y-=?65q z!Srx4Tmb3W%lg?CS`>u;5M&7cA;@4Jyb5A0Jo7N1me%0RV-B^Ok%7SkoC(3nZTb&E zhKWC*$?e4tL54>l123;cGw{I)l=KV9JS(6kGBX%}O#I9%Y!CH~`A6>2vl!vcsoVBb9d zDah~;WG|>FF#9FQVDw9n!Tc7wfeokzLVR-%Y9cGc1(1nfcpt)iQ}j!aA?Fv=H-~=- zGVJ{Y^$ko9JA;BLI86INdO*Gr`7Ox6_ZxIh9J=KWsFs6$^9E`+BSQeh9I$Uve+x3i z|AxlRw%>vb8$bqTLAS`jBU=I0KnBzPOh^ENauJ6EG?yzNk_2>3L=V(uAZ4a7WeEtw zAdNJZi5Ecq>YYf6lVFMqkQ77Lc7YXZK$8#1>?zGoSdvK2687of@*OeLVH z8f40Gm^1@S+T0Qv4j^f80U!XAg6~8U<66fKUTk&TZ<3q^K39r~pY3yj(V|fGP#qxe}(d0ihIR=NhOQke%mXY8D{W zfbG1Er06G1(FP<%2s?TAL;L`;Q`Q+890w3eL3TPq)qw1Df~k3cPy@EJ07+3UOwk7< zMF=}*LzRN;oCs6OfT&DCb{<1gvlXUB0aeWxs2Y&Fp2O5QAk?64=m0G@R7P3>&*K91 zZ303EsCqP=2vr0!)*Pnj08(Ot_ym-gHXtcYf+@X#q!dy&gRH)Wq;v{Q=>vpP)SUvL zQ(sxpQ#}JxXo5~hG`>*4$lwl5`pgUopbW>!%xM71(VzwG8~+J1tOaE_(BZYO{|PcY z2W7ZqBxCtqp<$qaa0qBYdmWM*aE5b0k!LXd1yukFqga?B9}dHF5#;b%mWdB4*ci-B z4?)rxNHN$n283x~CEzUuprJ}=(}W#*t|lA91dyL3SU5wxpiL9~|AGvP|DnB<%l`!# zPJ=k0rim$o5Q9F05Q7P*m(s={#L&PX#NYrj0K8Y=I)f0yMFt_r@wE<&LJUfbLXZ>o zCo%~!6fy}xdMS^Yg%~a~3qg*rwSc;VmBGOryjP&x4Z2sLpGAnFn?;Dh1QfI~YEPlrs=?-m0u(Ap< z{0CVKT3sK;D#Q@LDg-&&AEt+mVFO6dURHLH9#FlzoK=WnA*&FBc`CZy38;31>s=wJ z-HZ$mAm)JU-5;z%44+tqAV>RqvI#Lbvk5Vn%c2|TfNCJbH(^i{nHU5tz}6dH(gTVcR}LWtM-Cwd^LXgOc(`vC zpjr<0&1|UMj0_5v;Iv9?F@mS1?dx@gP5SScpRqk03!NeXZo^C zyZ}0rDH%FM2~z$ArrZI^70^@!s%uTzkydOA`+@_FlNo-1tZ5pOv=K}ie)O!V7SfR= zfiP*rvA1?e1Ca$VY51|X=DtYM;OqlG@|J-CeB#Y4Z%CqHWC*ZiVPKSH7ZpiCKJmti zQ;30$QwVb6%>r&Ah8%7o$cZ;>d_oMDc!eM*-V_K3F<1x)K~B6;6c%E5DkKCs@y1F_ zh`|JeK_}kq6cb`-1#v(p-h7l0Vt6ef#Ncqingw#=O^&1xgN>vRX(0v|X(7mo zH!^ZU3`}xD433}^ZzAP|7_{YuU?<<4fQ)Cy`9OTa%iv%KIr&D+A9*}mNl}PFP7zvB zz!dW{G}wU)_#=L>@$8h>5Od%a#DNR&1Ouv_z!gL;)G|hf4G{g{3L;KXh#^7|T0yK; z6k=GZD8yhchHl^jR0AO=-#oBmVc6miJ^ALfq7cJlMIi=L8()ZHKzZ8FADni;c^Xnw zKY||n4@!oW5Lr%Uf%9Z3qYoVnl@iGgc#myKz#$#!^-dgq-QT{9Y_zTY2&0R#9*f>#9(fPK2O+yYB@ON zibL&YWDsx!hYHv?b(%s96`D}roYfR!I0-Vabt%N1aNi`L8VK=?6Vyaj1_zLdUwG#Q zLF0y9ONfD43mP|$T0#uAT2SA>^sqBDfb{HT^#SPt`KDS+h@o6dh{0SP-Esv~%fY@0 zg4)f;(2UG<7))r#;3gUn|ivc=93|=}y3=SXz zz(v499U+FYQNSAt zO>S58g%~dALzA0`fe-_q0W`V6^l&mP0O{Gwx;q3~6eJr6F~l1PF_;&fA$f!fW;Z~@85}@*_Of<@^nfzYc0(bC&4xk@=EuXn6dzbVW4bg>HxJ3WR^lW)T{+aia;&!K=7E@$~6#AfRwtzlsX_O1$7`ML*oLZ zr~syD1Ck=}csSVV_ee_nVM-aG-e54-g{D!EN#FuN044<;$DUdRaSt1VgA3%u8;=<1 zIQCv+A%=~hkUjg4fx+KIh{4@Nh`|Ijj=kSRh+(^l5Q76q5BS8J2`(%QbkW2u09_6Q~Pj4mAs;^e#*(!x^}J zkP$fW&};&dQjSQd(*%%|LP}mx6!sx0wSp;CKqy5Wr36(LPoX+M{*H&~Sb$ce@a~5A z3#6zSrYHfS2sGkr4OIj3&{mk5280^a(Oi(#Sx_AyQ*Xj_Fd%e*Oq~Z+12Xj=OpO9U z4LE?#A}P|0f(DQQk|Ic*1G4i6R4K?#Uzkz{gi?^5x_c15ErP2-1R~g=Xs9C4Jj6_x zq6CB@Xjicpstjb`UYN25gfftQ2cc>}etZN|vjCw6?8gsCig=@;e%yeh2;oO1q`416 zn9>6Xr64=QplU#NhQZW4K&S!PY2J#Y2%O$OASr;`2RZTP2Q=w3Gbp%%_H8h8{)mPS zww9R*F%+3W2U|Co2{EhzWjIFYUTsjwT!* z7-*QQoy`EPCF_VoU0OXTm7EY-|XoKXFnGnM>kWWAp z>rLiD3{~brkjvMemAC3?E#Yid7>0x0Ia0l1zEyc82*C{tU@>N0IGourc0p(1}N)3h=(Ru1w?X% z^im)h*fa=g97r*10#xw=gpr`)$}|N@krqtR1|&tGvE^k*ib7$E7!W~?G-ACQNofO2 zsQ{8vND&A!^*@r*`7oskP^Ao}%4;Aw3grAFFzEuQH0abEP>bLVG;e|wy@x5ffT9RA z+*-!KV7?itF9y!W2auG3yKIo^hk?QLGPEZPGSxj18gdQ?;JF^sB!LFAu|L9{MKHwy zNQxmX4NyhejihugOlbm=Qb^+yG)eFPN$Clg(gF;np!UoDaD)TC!ju{ynxH5H)7%jV z#R^GKuPGoDBQ>EIpz9_;<6U+TrC^VPN`D5^DJbsuykG$_qf!&EjP84FGZ&@{6-0&%X$ESO@%xgyt)q<6xk5$B3n zB8?y3fJr0H74bll{tlByoGTKJBn{37$mfdqAuUL^Pk{!G1IjcHG(VYYAZ-iFfhk>p zltQ5%249@86*{I5D)}eC6f+msQEhruC?3<{1ykQM1=ZV)#zG92(_VPF(w*B7WkUXgytQHY_< zQ3$dky~Ra{!NWxevLfBhU5J6pT?n!woySXv;f$vcWJS8TuMopcA0fz!^o9T-2A2RK z$cl8HU?B#!U?B#FgaGJ@^u}NzhVWn^$cpr&P$33|P$9^Q^wbC;2IUAL$cl8OXd#9d zQ9=xkpcUzMaY76#aYC?_=_?>3`A+T-pYSpW1VdJ)e@KH?p26`#48HNu%5zb?5W}2! zXypmh#Ltir3~ma{1L*-(p6}y@7+%K!0WV(Rm1hXlaz=&;5Octlr*?u6 zgK7e_DNvOl#88$X#9*$8ekRI;>nH|7R;nKeW?|?{hptrLmLSBiAwh`2RMi9GNl;0r zkq%DvkeU?SZ{GtwX%>{TgCVk<%mvrrrbCs2ieh%8j9Ua#ngCmlZmxwS4Nh|KMeLAa zy%%v1cW^Q=gs^~Ds!z;@wxYQcg&6*WJPm3^&rB3zn4Ac0MZZZDVt4}LfLhT(NkR-B zNkR+`AOpay=&MOW3`diot>}%(LJTvLp(FddQ-m0nry!5)3&%t3XJS|o0&c|K$$-Xn zZ>kVOXDT$VkEaST98QJCHB1i+!vm0>y{ugzJ)pQ|OcP@Gn<~U$&H$Yo2jxbvw;d3H z2ajt-sNIYV0-@kE1CDFkG$97_G-zD+qzN%}fCR3tg}4)LpaQCakY-;5)I??m2at)M zc~@mZeRC{Lh~W^(R8S+9Azg^!Pa4!WFg>gc4In*xStCGtK)$g`7h*6=2TdVChm+x! zKe!4{3UJ?~L+xf{*Z?sH?3=Q5A%=osfe_zJf||(6@Bn1u z7v732sBiwK3o-l#nF{iaWrh%gX$I6cFg@%H3Sr<4(G&c*J+c=pM z5HScIe9M>*iDHnVLoh`S2&2F`GYo1MNYQhcq5vdCphnj=Bt=5mQ0o>TDFV0sz~)^= zQfdoRx&cWkxJm;LWo&>ZL6FrMFr@-0o&Z&ppk)&u(Hou&NXj71VZ_M(vIdC185tVF zAS=}S@}Wh5O{Nfo2?&FVfJK=?40Avn(8&JBOd*EXAP%SqaLW>6Z~$SD0pKEFdX^Bw z#4KnL@GDD*;Sq=f>PYkD2r+!ihIXX+a)lV!a-k#pm!R%oXJ7~i7X{CApvf&SSBN1i z7g`jo%N1f+0n)R!l#v0Zhm*kpq-QVdRFED}a{HSr#PBm0G?DZL;yrlgS%6wfgOl5H zsNIYV1rT$<$;~!Th`~G$n%w&Ggcv$N0#)b+HlP{^$vg>-5Nnwk7Jy9r%)2!g>YKZH zLJT)Srh+n$c)k#Wa6UBi!1S;(JOJt0%bE<*1M*E^z7T_Nz7T_X<7bGmaNjtfS`PM2 zF4S&D27w50CItJYH(!XMJs;|uJNZHkH$VoaqZ_DzY9Pcn)1W4@GB|)t{KDIu2lb6u zfe?dG0W@v`3WOMZ3ZTA$>0xJR0O{GwY6#K;@=aHP5JOvm5QF)-S7^R@fJmqCf^7-Z zZbpU;5Ocu3IaVOVZ~$a4s6Q)OD8wLGD8yjC1>L{{s0K2ax1X6Y$rfdVkFmUF5jHKunOc4XZEXZmUaN%Nrw2(N9e}be8Tn`pNm4ME1+5C@z;X^Yd23Qy#L_k)mo0LFD z_`?f@7`zLG7)(GT{BH||7#@N+pb`GwA|ZyxBG61;1azf(LL>`ALNRoNU%yz0L9rM* z!td1zv4Dx;KqO?PdS(H1g#S{p5W~4*=m1km>~=ZMbHKmXhL`SCx}u|j@kiJy5I`3eWsU?)ZBroIe@B$ z0V$~Y3Zd?PfKY=uu&xi)0kYW`rh@^g><85)oL?c%1NkHlrYHf)Cy2Vl2uW!tOlbj< zQb@@U8pKFIQo0+av;m0OThL7EYc@XcOf?i4em!ke@(J6q`~Z1``kl zHBlCo3Ng$8aX?KJCntq@}PT@G!c zs8k9u$W%hd`Zb{LU}88B1s>}+ErkYcPo)q;MZ#4o(_%b{^oRU^buRs;3T zmKq_34K+~T!1S;)6oB;XW%UK=0r}=#jS#~tkmb|REq6e*9PFDgsNIYV3n1ozeWO(? z#Gq0Ojho6^A%@agAqMk$bORMo4P-Dq+X+bypiF$G9GYAk5J>`3YeJe9rb5tk3sU?Y zrdR<W#mNp$;2`(Cgeg6MPztHx%r%jefiuGtb_)N0%AxCC9ppuDNcbYHb7Eb4_bK*sw+&bLlKeK4^tX|q!c{Z z3|_U~fTVO6Olbm!Qjouup%22+Vxg6@GNy%i>nSc0C0G1brit zG&m<9EkQRGMjDr~u7L*61Ekyzifr%>3v)AQ;J^#_21LMsx{9V@u8`2nc*elc05J>P z{|W)8C&)U=bx3!0uZF1MWOld-ucE*jAd9PyO@bH)N<04`O2M*t_d0N}gYPp)SOwb* z5y{E?Wd?-9VEPMcBq;6Z)k1yS0apvT8k&hi6Lz7&Wu#Lvf?(~s zl`u665NcQ;GZ@#Aj-XutQ}zH6f>33jk(3>WDO12OP3R)TQcyzu0#n9-rVLaZfEwP< zk>*$=>Y%=EKqv%cEQd;)nR96{v@LS^;qi5j4Dy zK$U?^G=nK~KqvzrRAu@EDUM@dstzFRg&1bef)sgRr!yc70_6~Q-op$G7h+f#_J9sM z;ycX1u(MW(VLhm6a29%^1t=APwJIEf=LzWP?xxQ~AdwEr5c~~bFA>fV2id?GLIIx0 zBRQE77kmhdLW~4u2n&dj*a}ky)87&hg||;KFhoEUGEdx53qKH94|?i6NWKCle*z(& zh$KG)CVvAVuLL~>4CJ@h5P8CWI|K1sApG766u$*SjRg5kq!Aok*!?C8Jy0EFcREBN zVY~lA>@L7=cOcYAkloWDMq;xYR?g(lg@o=8Z5Do-BeU@Gzn#fY6^fy`Wc*}x|hE9`(3nD0+Q ztO4oIhw0Cl2az^o3_;#$7Rb!C4_$u?QpTAE(|-VQN**L>o6bN|wil-C0fw?QNXnkT zlrj89_w;t?;Siu|S)m!~=?Az%lY8QYN?71Bm>xl@iS1!}6;?tEC)3+V(s3~91i17& zBg z7FeLb>^7f_Bn>HlRzU4#aMwG`z`zj8!mzlNnZZ&2Fav{roe+a=oe+cRH)!zzYCGmY z425jz1GTVCSBgUt52$RN4w2<#W;h6sE~rw_vY@6&h*D4%d<9WTI15@r>Usv`q76~k zZ-yEP%7VhJP!D6?UBqB|3#xFjHVcCmL?NRUgXw3ad0S72FekIZQfR1{av{ZK2245u zF1-vXHrip*3t-abF&Ntdmp~0>aF;&Jz|auO!VuTN%;2bSn1La&PKY5C6x^K900jm2 zZHS@JFa&iF>Y-apLBY+|2K8_Q*5EG8MFe*wL@D9mHh={84(!3b6lx?WxH}+5;w$ma zLzRO9eJMmaqZOn%&R|*xZFYftatb2J$t-~66Hvcp5>yeW1pEk7q<~NaEn1c#DU)c2 zhDrj4vb|7cAS+#A${f&?ff`gGtNo$37l9OK!4ywGC;Z}Oz@+9$-|+$Y3f!g_##p=pv3!@G$> z3?}ji7#NPv5MnqyLx{md=l}x)_e>!M_L)KqF0RKI7!E?m)fpH9Kn_S{=P}uIjDaC= zrVxYoOd$r7rNZ443B%F__dHV_-P8 zScsu+u@Hkv;V}k=^UH)7wk{K5FiAPa!0>jt5X0-`LJTJ1#~2vCtq@`mS^-*f9>>Dq zxc?XfL-Qsf2J1~i434LdF)*CiD#TE&Shaf#J|`A%?EwLJW=)#~BzxP6;uHof2YjR6WkX z@cWDq!|O9b430*}85s7T6=GO_R*1p<*Kr00g=7|nzdg(huD_2nFqp3T3CR`fv{@LA zbc0hccy%VM4-Lu;+J7KwKso0lL=7kNfhq7@#xn6lH8|&hM%FF}dxH)lW&qW!Ey=Xy5;}%EF$|wRc5>(XZLX5;#)H9fBKox=t`4)&mP|eB^k5~w~7$VHctgs$h z0h)>+NgskqC%~n7lMuQe!lWOpgX%W_oQ#kLr}zahDF*kT;|vT7l35sHrCAuCsck-`3w5QF+9 zA;@J@KcOZtGB{+hFtD&P%Bl205ATh>EW{9gS%|@fr-YFKrjC^%APaJKG5DbS>6e8V zCWF*~4!Vb_;bcevsev8dd-<{u!}-fX4CbG5(ERjZH{4I4J}Lu)yHznG!-Omr2BCgt z21om1Mh3wvLJZtjgc!VIiy0XlppnW7XR&}27y|2;vEF4(J0XYEI?@2#Ry8xjKo&p;X%0RC703|>MQHUZ|h60cq{|F0BV1^_)hpR#ic2|WU zi81x65JNJEBUa4F(0x^iq4TN`1B2;GB-hwZfVzeODWQW(3&@Dvl3<8MpkU8{DHXt~ z)G8jL6y)$8n9>H6pf@$iL#WvRQ{#ZD#uZ7;6_^?YR5f8pYJR}fFrcbQM^Ym*5$eka zD1m9JUxILt158Z+nZH462Wy>x-8?5n?EL0$pGH z^_dXE;b+kG#U3w(7=&Iz*B7sTEyS?=HFSNk#v37qZy*ln#B0xYLJY3&K!<~rLDv_r zd?&soIOu~AgU<&c23OFD*Wi<`&wmhNnEL^`u9)ew5W|~K@O8yEYK_7BrBon3 z;bBmygsdy}m<*k$d;3|4;pJ!OM4kEdX*gcuUP zfX-d0f|v_RY~V8AVI@2>fpQ6WqRtU&4kN<^h&kYix`kha7-oNgPSkz)BE;|pWZ;KN zGy@e-4TP>Mu4G~OHW|9E*x;)WgVt9e22&YTh+a@9ZNg-5N&{!;5T06wi9f2@lqNo? zW&_QygC~IY*+W!=vea&fYEI@2%i+!kYlY;#2}m{DEtpcoI^&&4(%?WqTW4Gcbr%~0 zLltD5@!#pt8T{t2LJXB(p~nX>e-mQ(4&s1j@MnG#V(9+{JwZg|yAT7%chEZHD(DRU zy6-{^3%)~V@N<6%F@*nst~1X1DZ~))6M3ES7O4G93=^uriwj+*LgT*imk>ksFKFCf z_$9<}>K8QbVR~2?K7jP>W&Jb-8u!Y-g&5?23o)4AD1rnaJnkD1fd`NKlTf=E84Rky zX$Tzm@xO%_B7Z~Ue%)^&hE*T~SE9##0;++KDQ5vSh_!4C4ImRg^9oIa`sU4VA%+(q zQ$foC)cy!DDE)!@2BwFD;Q&a_Ue*Jk5CBa%C;Sm&i1{PLV4hh4F&6F{1yswyDOnC` zHzUIbh&f>2%=sh4FzpZ2H?RK)F+2wu7=&&h1FC@#-?%|dWMxpOVPRnU!utT`8`Zx; z42plDaTEVnh#~qf)Hg6a>qUPY35dPUZy& zKeJ5SP{YPxx(k|WK+1Gr${G-cfqSUmkrV~O6iq-<1R4uahx!p@QVmSe10+R|6@#Dw z8XF{~%VA1CASs2^v>;PEkd$76DRn@213J+G+TykmNhvtr2OyMzeG3{q03Xx_J{aH0 z4H7_%3m?4Tqn8ExV zQXLKsjRz|*liYNu-HZ$eAm)IR+$3=DPPQ$!SJL4BjlD$F3y3iVAat1v?(E7UhIJuD0kAU%6o&%=B(omH4&GOI9y z`DXO=-hgU3xHu4l+ReyN05J#bo6D@i3}-?1f-;a2n=peMn=pgv)FX;&9(G{{Hg;&-M6(MsgtH4XnA@Nm$bf1fgXu-6X`tLGG8oCnr1+XEMbZ^AdCVlQij?EQWOVM^Z}98z$-tpkrZ{p6geQ71X*SS%Ha)2 zO1Hq21|TVglpCPs99NN)-h?S#fTR?37tz~#ND2hG50dba+y>cd09tL#-~~~}&friF zS#7**0d%$TTy|lGiJ&kBtu{8~5N1&45Qdy5vXeuYVLgX1g9Atp_&kvX^(+k6=0jH- z+j9ytm~#q4&J(HhhFHMF@Bm~18#CwiIndR{^ErhXW^)Qd&J(%GDa>${Q<%YYbrVDb zD1&XA1C64DCCItf{2G!Pu;&_3c?Q)1vUwp)hXX&4|$B znGf~r0z^7MQEY;w*c_&K141#Pk~PghQkn@rh3Y)!JKOiWrdnHlc=%!JMN7;wz9@;N-7>Py%X4fzQWY=?_uF#30ZBS#=x$%Gsdv zv4y#W8Th$`8Ni1)`*I00cyb9dm@aRHXaJe2zW^Fm3zjllur9|;!Dnx)W&%49BKhIWvD zKr4SE8mtWnkAi~L07(rvAQqs=Luz3UXqm>wAkYYIA(bwIwkf0pg&D*I zp|x;`pfE##AhZ^S>EU2V0O{GwstnQts)hRmg&Dd8g&E9WW+B`Mw%Y;KZg4Fe0kxZv zVFJV)aGTYH96VTMj2sBd6;SQrGFz-@t#Fy9;(5@t9IvOEpl@&}9HX%Cb&z`ofCwVRQ_ z0b&l=H_XDq41YoPf_xJsEX?31EX-i;k8a=rR0AQtxdSzkm7xG+;ul`QB~ah=2n#cG z2t$2yOjwxVkTBFYFg@%H8$f#YvhD|k04Q!4M1&dsfGod&K3Lg+YB|_9Z=iNFGCY8o z1NM!Lh%keh2(*RNEh5a&E+Wiez7yTR1XKeVO#eWO4NwNQTLMk42M{p`**3s3u>sU= zQh^2zNO2}i@dAXAh)is1iKKK2Oz8$BrH~c9prW!CN$F0QQU)X^fGW?KNQ&;k6bT?H z0yU~8LcI%eAM;YEXB?0$1(~!MNs$IjQ2>%6kehziLUIYnq+pn$1SIPq%`?zePd;d7 z1}Oz+r~)Kq5MP2zHPg$#A!Es)>5$0~GeOfKAsPs)_CbU>nG=xOsEBUiCM2bAVM-?; zl)`3ySSGFjMb{@JUfr7WN!HBb*1)WJ4! zg}4he^v1j#>|gNs8FcatnurCUy+6>BW*3MmXt;&2OuPY}IfE>13u39C@|M+%F@gm& zWM{@0$ue;PC|KG2Al87U)TToWfLKHRqGl_ok)SEHV-O>;O{u}wi-l)HTmXsywiRHH zax!b+i~wfz2q-|(?*`M)j8i`Yy8gFi2>aV$`kip<7f08B6FO!Aa{n=y{!JSp=>v0F z*$HN}1oR0>Kif*E|4-x8e+OMZH*|~-WWO6s|6ZK>Z=>rshUy0;;8K|W21H(gr6XuQ zEP#$rgRI*MQ~nXBb@$P&>qOH36{i0_PW^Y$^$S5e9w6r`t%3%Z0J3wDCX81@8=Iij zbAB+z3COd{4K<+IWzebZrbu(KxiGbeW$k`Q(mgO~#Ip9aDGuP7!vt*>hSe}>#Ip81 zNYbZZ(uig4r;((=#V*pacH?gaj0^!fkVMMFAkfUhz<7~Wl5Z{aVp(}nVTOYu!VK=B zg^UavnpqfR)<7?o)t3}zP?QvAa8xd2WVj?L%y33h7&1xw7HS+LgFp-9V%d|cp_8;q zQo;;!Qo@i)T9`Uk289-+N!ki2VTKZr8qg#yObsW40Z0vOlJ=aGFvBS+VFq&(X#NDX zA;Eq-un?tH!@yt~11;-7ar$L7G)_Mtlz~g6Ku{0Lybnn!*t7@OltC_>O@J0etPBYt zU&1bDSCJNGP>>d8Z~%!KzX44ULlrVIYyc^2W0ZQb1{xeG(!vZ0($L_T09D7zZ~)|0 z*oCtTq=gygNDDLgf`S94hLZutG5{wG2JjucCVZug40oi38E!}mGnlV}ngXlMO_4Fu1l}%~B84r`^k8}wN%|&CdI2m=m_I?11}B#XFewIO`4bEbTc8UWSQtLE zurM%Yv&w1gXJ#<5JHfzUCnL-tA|uRTVt9gqp+`=b!A(w>!2zVq(fb4g!!|`>hBifE z2FHjK3=IA%!VHceoO*(R;f;zg!xIpv=mY~pfT}QqhpI4x`=k>L3>Vs17}WPMGdNB@ z!N9OdRhVIosxX7&f)fl3%xc06e?gqJCm0wq)Px!Q)Pxxvcb#Bhs8APXC{h<@a6Ep3 zf#IaOFvDRG=gJ8N1}6<+1`!Qm2FHgd7#QNUgc%IAgc%&)onT<7))8j#)e&ZJ{C$Ff zpIAbczz`)?bQ^d%y3F;nZh7BNtN*P(5 z)QcDyOr(k!8NQkdGkgXsWpH;s$-wZTlZD~wW@ZLQmy-+(>Sn?W(q>R!l{i8Q3ucCb zE*1vH$1J*=H$i>1-AtHas~OZ+cg=(uZkq`+IDnLaeZ^`n%)o38^%cw*R)!5-5MR}U zi~;#d%Uqa2!yM|X0CQmmKXYLQ2aqzbujG04cnFjWT-s*sH|k4!}< z27BZILLsPRWiWRSgs1?uH^C|v;%qCPgEY-AY_EsbxW@G-85n99AOT1H(@XVTSJ(!VD(MPcksbSqd}ASPC*=p51wRTaJf{-2sfC8VFSqE4i*`ckA;j3Q!RxVCWEv-DP&~WWhus3!DK=aBf|zO zVTN^9!VE5}ix?TELp{X6;LyXuz~aZqV{*NSk>Q4wFvB&FhEqk141cYJ8GeH}dy5zu zl&pmr6s$pGhdnF|j!%jh8G5aS8C^GGGzpJTt2`< z7n-pbLY>3LFahM8Y-kpkY$wbx(M}kW!FSjRGiSAIz&;uIbW#tsw z4vm!ucESwzKsrIO!fG$fz-$kV6&-tF1}zW=6e}V2!VE$7!VC@|0}!zSGnj=zp_he$ z5f&>o_QDKRAg!QSS!gfJFdw89qy!u*r|pFqj@v_H1!e>rLqRVjR_<(LW-tN8ij9LX zgOvj`RuUbA8R8wFv2qpaAqIv6AWg7X>2wfgXa{Kk#mYJdVTLsz4k%VGI|wsebO5=( z7aA)Lj=~Jz9KfLjE;8>!jbvl^05TF5ve7QW43RF-kZo`gW~g%k>w$(WCnF@iGczdk zu`n=lvvM}`xm+zbi*EDVecta3Ixp%v0&FJXrJAf2FUR?b_PLB<K10aJ?s@d<}!VF)*N+E7HfU0F>V3@$d!1#$p;Rnc4P!mDX zN0>p@2U?lN_y{vZ`3N&OfRuqN(-t3Lh9)1V+hNAAGZ;*ORHkP@#(>Lmo$RHHAoB9ef7=x8EfIGzRwakd81+o|R$4L`X;2Nv?#E!3EUggUN9+901AXG730>dU@vF&{=Fy zMF_6B4s3(h=8)c<=?({owV)dH?Jj5~{Q#j1+<^mcHaFLRwlqLW!KQt{rVP^YRq%uu z%gpcrPWE{X7s*sVvVG;`iOB5tt$dBt@VuS5g~7(My=31T;m5kQDLl z1^bYbxdBNLXud$E9bu9&Owj@)MIbk&ASsG~DLR0p2;`>ONQ!D-0$FzsNzo#h zB8HuaZ~|HP1F8rViN|4z6p$2wtdm1phWrMm$N^1JPaI-^fqNe`2o$zKJCx=P=mTg8 zFewI8GXY4zfE?ii)A|5zKKMWg(=a4Og)l`QkQ9OZT!y4*8cY!be9?3usKsh(1@#Wd zy4^5E32>7_z>0jJia@FC0ZdT?nxZ(UB9KX}`=NebfTRd?;dB915y&KPxo`kg0Rw}3 z`*8+_hDj_8k6$x0IQAT8V7TEg%y7Y97;R_VsoKO8@A*MGpqw~Kua4q^Mo1x<_a@7fD8bi_qsSwm|_A@ak%mS}0IDZHl*WQJ~4DN-{xNa>JW@s#g#x+b23qt}(&tBGA zkRDK6?=KW)*j*^hV4efr9s-Z+2b54D?-!2n_o*f%D{!VG%F(3IO;EX+_} zEX-j31AXK=0o6c=Z%#l>WMxPInfQe_`v}xGdy9n`c7jX=EiC_DEX?q^80s6C9(INW zAU%6oB|&;XzA-EjX3#AWW-#|d_l*LoA9NzpTy zq5y=g(EJG+$Weqk4rCtpQK;1)kjw)qN=8y-22JD~>19QLy!h>VbM0cZ7nBh_-Gz)1~2{R~HK@%NJ4=01b zTyPfZ1L*-Jx{4}chN3EA26J|#O;_Nsa6m1q!HMo4)NV!w2Z%Y~M0c`EnBj00G|@>^ z3p0pRgR)QzB)s5xQUTRKNESLN4pGI-PyjOVGw-_NP~U`93p4mtLw&QjT9{#OHPkmS zJ**4|KzjDF#(?yIeDk4NnBfh`@|RF!;g&x@q-A*V76w(s$nXJT4%jz3HNp&PHBjGF z*9bF|*MO=r^zEewPz{9mrXFe{D}%y3@ZOA?6Hwo5uMuY02r?B^AaK+QGceUceFM|O z&QJi-vzJv1qzB}i$Xa2B;95|{903U=xNjOzEeFR6zE}Kp!pk)=iuSF1+d{c)1%Np0a@-1)4l*| zI_Pu?a6X5wBjJKZA4qWpOz{RJ#r2>Q0ilXjqY-|e4pYnk^*e+4dT7E1nFY=%0#GTC zrC`?^gH~@lNJ30uVYo04avS8WbI{e>es#hOZgs+tv!b`u2{Wt$aX@E9+tdp)7}X0i zIDqtkS8oT*XJP0%3thc^tX`O5S3Pv~c83(i0!D@j^C4$NPdx=)y&cjZ%n;B3UA^7c zAk5I!Ak1JIinPzO8bc=2b{)z@B@6BF|tNEC;a_3W!MO}4_XO;Rs)?uQYv;D>NEi)rQpZ}uiO8Qq|^hZQ~{wBb$KtS z@=!~FI2n}Mb749h5IVrd`al(dmiJDADM~<61af96R1wIeZ7@X*2t}ZU(hHz!K)${W zQ?me}23$X$L{h|d2I}7pNQxk}56JbOph`h@YQdBqKqv*-DVqrKA;?aDn3@L&HDEj4 zkQ7zH6n#Kags?LosuX1BJeX1jM4b$>a~4z$$j-wsH3|qdU^@>ZDS8J}WPqdyVdo2| zQjncOXQ4sjfKUpulNV|5!VIP+0ac9!R1L^o889^s2sNl{{Xt8e)1f**HiOgr0)%Q% z+JKxCod7KnnHesCvKuEeCkrS)gVt=HXb@&N0?KZ83m6%g8ig7DfwG$_w44AL`xxes z1Vl~&Wj8M*HDIe7P~;g*>!D>4sE~9y2Mv|=8^Fa31Lo?h-%Q|Ak^x>yo`C8Hg+@M1 zzX8G$XdVQe!uK0V=^U6+2PCE7HWs9eG}nXXLXf+_4&Q~-O}vmLPH;CtPpN(a4Npb} zh6OAPjKwURt1d&^Qyz`N3>J;T3?`uV6jPHh!w(P#w7IRkNtmIqNtnR|)Sf!iB+PKA z3Dlli0Buh>HVZRYH$&S~E1HEFdO#ddd+Je(FvGDHXnTsKO_a5EfO z0A4eG`#f~bctx8qLrEKS&G@D^VTN^W!VIP#yCCX8(YotAG)5k*hnH%gXl3d~r~!u# z10onf%@6R6l*^%GvMdZAKo-B_TzLW7Sa{ba%>!2H`fNCJbHx^J6Ss4sKCVt^{y#)15Pp2?LM<>)b$2x@>4s}9(1JlFK zPyo`im-REuHw<0E41YkDzo~%)5-9C}ee+-)a=L-UjR(|jMur6tbHKi_=@Moz>w?Bj zcb70jdzUbS`BiiS51<;zV9JYBUl(11CRYVSazt4(-j7rS%!MgFfCwOH{4dl|gS|N*5p;3SKp|AL+=I+6#XA7q926{zPK5ECFM>#NoxDRzM=7CD<3(7&UC?JS1Hxj1U0V!A@X#=D*1xaZeOlbf@ zDa*tQ;HBl@gtP`p@m84P1Wd)?IASn05JEWP4otZLTzMc=Su6Bp9?jSY zyDy6wV+1Gj3g~2#86(QktirMo4}oTu)tIiFGUHz89*wSlDRi_Mq(2{~ANR^_Yjpklko2#I>BqfLKMr00btL`o zVft||R5wT0{{czA{tc-AajzV=MAy#=Es??ghv~s&TTm|@l=VFp*wvQ9_Pa!$R;!VDUdq02cNmas5Pdk$UBSvy&np?orQIp?{_!VD)s z9ME!3`61e~ zkioDuJDdxI8Q2#<*X-ym5N6O>09rG-jD-QbW+!TaFhj@!=$ajv5o`_kC5#K54i9BIvt&q84auZ6-4CZIJtg$sol@pAJVI{;zOF+hee6($uFvAv*F(4n^StiVI3uFvP8F*a}*K%P7rsZ%SB|_c9 z%rF6D5Nwfb!E#}Syyegso3>n-VG39aWRdKFl`IVQ_m~+RL5pM$Ef;3kvs{?LG!nX> z2UM_%--8x^2CHFx1n{t$`7fv`uR}jK6k)Z~%nw7z{2x*~e4$QCv2(?@_ zNNZpBWd=n?svMD2J(1EV!1vzyOOv3`G1_skbNQ*-r!lWNSr9lm6 z(ELj#ddoTip#Z$t7P{nb8Z=8VF$k=JET)Wq04+B7R|qrku7DOBCM$#)j6fVvu@SvO zm?09x0Tmm~D})&uSAdF*Rme+RVFt4>6o3qd6&tHp2s5k%X$39yyRbr-;T%XSNC~*u z__acq;oAymu>muJjp4v5NU@;_avNx=U-n92hRl`FrG67u3N!Srgcch!pdMmi5Lk^= zZ0uMm%&-ll0aR?8%(Q&85mZ9+`k%HZ0N2MW>5u*LYJv7f*Q%j-~cib zR%}dOCCo5!6*LjXm>CLILl#r+dzyMx|IQ0>}S7VTR!KP`_2J7iOqf52~@&vM_-CwrIUD z!-Dm2zs-TVlbK-w$RL>CPOcYbI1Vxd9R>n1fAx09P6a8AyOEybOhQFIgEJ*0V6Mz!qL^ z-zdzmaU*B}{(9)b%T}mDMur6-g>8&dUZ79}tvBW0B+S6M3A*qSrjC_i1IUZ89ft{< zgc+hhYC!8xVQM%T4uI6a7F%xIB+RgSlQ4sM4D?7ScyKTvY7t0qn6o0SLk0U!0j>n* zKL!TVFVL0=sPjDaDLBwzooB>COCxA$0O}6!gDAqj(2^wtQUHLQ^%$m*VGXP(!YqB5G6#e*@N`=plA;ipq68#GprMa1NQ$aqiW(4# zpu3<`!VnfNfGJymPzJW}IFh2HFhvKD6oD)h4@a2v2Bzo%LJ=f+nT8`N6MPO02!^$Y z&;m`rbwd?_lPOG*0+J$-g}b4OK;a$@Q{;fA=rB@8unMLKvD}g;!2w*Lfp$BC(+kpa zOK)z7hd_?l4b%DnZa(-VW7BFRMUP;LJ|Gl9eZ34x8T$*Eui=B9;P#%W8FU&Q8v-dDOlKmE zGERC4jRXgTGU!1mpqavbNJ_z`1z=MKDJv&HNBEc-95y1Al@42k8LYN|%F2zCkis@bsWMO~g38KiTZ9=VZGo1RFm2=fGpX0igsM6yQN`22*cn^n=RFqp!dL2P-cT zJF+XGia_P%JBT9e<)tiAUXXqbHjR^c0>W`QAW1y#QYMLj3`ngf=|~ZOnk;#S*R*-4~!)cXMy(NFXSe zgKca;QU;nj25&LB3f%(F%ZieRGUr>dN3==>K+Zd%BK%ofAy+5`IGkn=0&9+aV0u&t9zy2}~vihV3j2jIUWWru~Hud`{dU%uv1qx}TkQ zmoUT4ouCQ*?a+bGtUbaEE_`OmD`%xYzg&AB< zLI<^)PYN?Mo&@bB*a;ofT6mw$QV%H>ElUZhPNPNK!aL3 zr-T`_PJzb8c0v12A*X~Hf=bs!R!VCeYp}wm)EzD4MTA0BHT?@FExZt!f z!@SeN4Bnuf`!E%3aN|Xx#)Ee8SA&cP`TFQ-VTQvX<3YZDeOj2|C9?4_E#Tgx_!(ga z!84!`0B@e$3Uxm-1B}H5vjEnU%s3;=kah+-2GDm#n4t%(9Wul>VHXR7GAOP=Lwx(r z2s3OsBg|l`4n2+ulqr9IgqBwq=E2J=@VJ-xJg6#owtIk3!7-7c7&gYY2x+m0$0w+1 z4fElqfj8r1cS0fpWMw)`5d%~agXt}(G{~+QFlhy-v>9Uv-^3ZHLw^p?6)+(4w!<_y zKs7L!uZK#5%mWuY2~a6B#t`Jq@z5bCYXgYum>4eXg3JlHe1Q%@8J-np&_4?u+zUG^ z%n$eqyaP(RdHUJp$x-0#p|h z!vjzNaI$jF`w9)=U6+Izc7Sw(2Knw^5@xsy;($V!?XoZf%Vl8(6Ho~2T^450xeOXb z+KoKO2Q!$3!C((k$c9}OW(Wak1r735UlwMl1Zf2+0T1%6zAVhJ@G>-HVMeeq6zqY7 zYzD|}ppe~lMVMj76==xbzaq?V_X;#*r$9Z#z_0>Cbgl|BXn{DO zkPW;l%;0|&bk4;d=pf&^tHKN=SHYnK9tN8SHIj|t0mw*L$SU3tW{|%D4OzDv!VE4q zz1qtVTQO{pyO5cK|^-$En$Y{Ti{RvhwNo&81XYq02v7jS%bU640?B=Asc#E zm?8KsSPyjH`2`C|sldr_U>{`f_LlF^3Zwq6Fhey+Cumr4*Ii+T9d|*e41nwh?K^*T zSD4|!U1)U(GlrYt1IY4XMyU>vF`$Zp^PVsR>pfw}@h&d+gc+RffofHdF`!wioO{9y zS@%Fr0{h|()IH1$3i~0$q=@5PCf^fgm}!h32{3sL&AO*@SgdCA5gdNy(i4D z6J#mK?LY1bGkgPC3Q`8H;1uo)GsxYCx*cW=JHrH!mBoxwE+At-Zg;;g%;0<<>h`Al z!VC@fg&7<`%D@%bs{6tWEAGSHE(3KBGs6LpK`2%E#rwhx=fO%LUHT7DwX6&b2Oz_r z)xV&fg8%o08NT0#b_y08U}5O}3GEb=J`iR|e*oKTy|x z)-O;1qU<&|hURHdr~WWlIuv`SejU=Tq8BiQ3lQxA@Sv1lKEl=5lqnoBt@W=hS~)Plfq$&7#1L!L!eQ_MM#QjV2Tuw6oIT0E<~8L5T?ihNfF4p zA|yq}V2Tou6oIVUiKOT?Oi=@pB9L_-krWC1fd;_>Bt;EWXQV8y8o0cIdx(`z{ z0Z9?a&(n|;vHXSk8A%by&&g2lfUMJmDPn*t3IR88>!FH3e)fYYQb1EQ4M|ZkOi==o zBG3Te3aBEGbzq-6pekTsFy_3l!jQXN4u2PB*!dm0(ix_SkKw=(@OtaJ|Dabr+58Y@u=pX& zV6KH;NHf5T8E{DiUblS;=sWY=kLAT|$Qu0usEKS08$c$0=6wnC z&ANZW3@bpUg7#1R{U^-u{U6jfFg+X$49CGKZaPR0$Twd9g&Exb3p1FLX80_Vq}IYQa~658pk#*KvJXzQ)Gao2$Ux`At?%kDQZAc1RmW7n|B;Z zX$?&21SF-!pk1I~_jN<}gn`_*9H#UGl2XtSso(=q%vT{P1t*vXNXo$bN$ z2`9isff_3`xf!vFFzB#ClUpOJ2tzF^G`Yd_a58KF>DkMAg#}s^>}3^U*v=}#V4euw z#Q`s+8&FGWaB`anwVRRQ0mK||a^qtYVc=jBfn4bo%O=7Q$tJ>J&Wvtg0;+)!-w4=1 zLY0|8;UxGZ2K5b04=Y0gNY7r@MIb$(%)`wt!obch z!eDMu4KWt(8wFI$!M>4&+Rex?0b&l=H}32r436wj-%Mi{VVDFmP!8Qd22=wfzHx(^ z$jWd4Wa1azLu}Bvxxg;Ma0X;5$TwUZA`EOCP~X7xurn~60vBurAUz=8xNwLtIBIngJ3!hY79sb4?9#*1Hve9)?I<5$PlJz0+J$7QSbptQ4CDc10+R| z{0&+qzzU5CkfrS~r5})#mcfgHL?orlU`idJo?tLvi6jlq{sB-a&?-mJWE%r`JGg-@ zBrUNpB%Fd==9SLF!eDaq9|MCRrw9WprwC*__(Dz*hRGlfXghc$mk5J5mk5IcNDp{B z_=8g{3^Tb|7#ubJGcX8pi!d;Ai$E^(sM5YeGnj66ffxb`$MY~l9?XCn z0&P5jn({lK+rU8feSs^Tg{+jp^e&Pj2~Mb^79bRXb^&uh=k!5#dco8jK&V08;S1^% zO-1r*9!!S=LI=py!%#IKQzygJBp}p))9M=}Mf+fi3Xl{*ss)gpg6WWu0eSZkOlbo` zDacL-BsJ_@P~SEnf*73i)1Zn#JJWSwiWVR#0tN0Qs3MSU0Wd`e5Q;#y9e}C<`LGnG z<^e(t*oQBX6fJ-$`hcVe;X_fRHN!_>N*Pdn=nPc@vhyWOjRHaq*v=dzMIzkLU@$;Z zgs`&(njk^u*~64NU^ovHBx{kBX2FyOASs2{&E_|dl!Ehc0zw(;c>X5ZAm2!^a9RsOnLZ%d;{8yoyIG|5XLJ4xxh<}PlQ2+585o5%O}Dx zl~07h0b~HUS@NGxgyAP2v{{nDFT&u(4{erg77$^WE&y$oTo)8!I4dXuxxgzB>JBD` zgfrmH*crSm3?`sJ^%4?ca1(+CYKxEvLxYeAgJ~Di+CO(*Xm}_fJPHcb*+^=@0pWlm z52DkNr1msvy zoogg4!k{NC!eB0mZuf)f@bV5`=Q6{W5D1(F*WKVcH&0lEAww8i=k662Vb}>W@M|%m zQ~`VD0IGoy-*`ezWMT*anfRHPg&*ph@4_MspFyUAd}Amg!k{Yx^$ko93&RAEp1rJ_ zKp_C~O}2;#L%N6vgZX@P%NtNF2e*g9pmsAd9DtYu_RVq;5r%~#P~UtL5n=cQGOz>P zzywqSA-<`Hn#juV0c7GA-b*mw7>J56=!inws#&5U3~8cJ-@x>+GZ>r$hiL;y56Cx5 zL`4`Dh>9?nd!SpcfND9|H@#5185t5F=74?kKvaa`7RX*u*GOMXgh5+Ogu&bp-9QFZ z0~t)qpoIpg^!m#WO|A)uaU z)~PVX21ts*4uC2SM^bzUrq}_Y7`%)OR0e}0u@6b{TbSYigks26ZBX~nR0lf21PTQy zA!sNRAR46bz0RP9ZU&NKSD4}igktDEeNa5LLPxhiV_(S-rC`s8fV;V}(5@Kheyt@C zS*QnK8;t`Y8;ygY8;#NL*GhJRlt-Y6g6|Lm!09Oj--hFl%=k7OPlp-_np{v5hK7V< zd?R?|&5SXG(Gaxm&IoqDmISm)1TEMLfhl)DEZAcMT`Qo>0n%f^V9JsMaW5#C8)2$9 zAX@BD-v@%*C9z0~*TEDYKq!W7T?JkIX?i!#0qjE1*x*^1V)zwErf-m>-@v5d*C3g) zBHbXvEdup4;&vttBxx;}H2iiZb4B!lNBGT5(3QHKCJ=8kGfX(g!oc{QRnSX}g~5cQ zkdYx@OoSm-OayYjlEHZvh7?g221l_%Mux9qA`EZEL?HJog^PR1^ZE-d?0q?I=v)1%%!3JOnBNtB{t`KY=M;unBgs@mwTn zupb`4q!>(_p?5HXTpcWq;%eMCC&fW-PEuF}Zrn1U9cHirY9z>yH4r1QA7VhJY7nnN}jn?}5p8)WhXhAj#i>$=2 zB1tR3q#wYgpCU;+!lV^oC5ZV?Bx!Krk^qxpaDNUuH2eY!Lyas8gX5dy3=G>PL>Sgf zh%lHwgr496YB9}*7z%DrAzz608hZ93sOUWbQNzjHfLI!hQUo?ZPf!76327Oy9|>nl zb~bPuX$NvS_62$#CWGl_sF9#7;Q}!dTb5ujU5T{eBNL|Z0ityTPN%z}ia@^UgDGM_ z_y&9q&RM7;P>SCSQ>1{T2y}+reI!LUV2TpZ6n%jz0$Il_3l0xXW(O2Sum-d=&AW0{{q!nN(*Zd8VG$eVzq!>&;{D5391`6P1Fs%>Zkr4uJ zgfel2F_?<{M5sIuQ>mDU-dtrc<^Kgy2=ewnm_moW@Nx-u>Ja!sQU+5qB<0F-&`=6M zCCOmwM3>GRP3>+#V4Ed6Lj0{W@8S>S@G)KNMm=?%)0MiorzF=A*KMG814u@c=_XBOfCJ1DCrLKO;lJQx=BHN-PX+()=LFJ9TavV8(+wM^k=A z23Iu^22&7z{v6U$Vb)<`*sTDLDdvd}AT6OYb)c)WCf=ztV+>;c%ou6L7{NS|fsMh` z@dZQ^sL10}1ZyH(WH_KM!mvwSguyt>jFI6VH1Zi40-mujFcvWJ zvZ=B#nADmvGVp7NFmP&!FqjmWF*3wyh%iKeI4Nd~3~Mz+7?x{@FgSqpIChyaGB9Y0 zFnrSxVQ`#o#>h~sDZ)^!DZ=2m#Eg;Qo2CfE2Tc(M)7Q|b0)_r8WoYO(lp#VNG_Lg* zNzs0oq6KJ*gx*2o5me^9f+_ldq6k#Yfrh{iASvZnfm(V2Dat{LEouUQ2|*@i8AGLz=Vih7L&TKq^eTUPDqM zs5G9V1`a|<@q=%Wt^!gbw!o7GN@=_sY9y#cJPI)qdx@y@24S~^I+1o~L+lPjw%cMR zEcpdPjRe{42r&}7-BnP9pwc)3q7YOX=R$KYC^%L_gb4>n4#Y`O$WG#z4Rg{wsF5Hi zU4a;h-AOm03PFkQCrn`iYJ{22fTli>B3TV^m~k>UAW|SG$*)6F;{;cOX3)!QL@kjB zQEy7^ZD#5_8R$GK&A&4_cf`P$JM})yhM})z&wHcxtq~|cqat2p; zi3A>Bhnxd31xe`(n9>7CN

BGN>X@bn|LK{rUh+(GDa*Bf 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%0AgU$n+@?V$SD5*Q2!o4 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

>vq{y15{A&zP+k_8*AY#qgpJ#68Le;=;96 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


-
ZSTDLIB_API
-ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize")
+
ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize")
+ZSTDLIB_API
 unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
 

NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize(). Both functions work the same way, but ZSTD_getDecompressedSize() blends @@ -139,8 +139,30 @@ unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize); or an error code if input is invalid


-

Helper functions

#define ZSTD_COMPRESSBOUND(srcSize)   ((srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0))  /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */
-size_t      ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
+

Helper functions

/* ZSTD_compressBound() :
+ * maximum compressed size in worst case single-pass scenario.
+ * When invoking `ZSTD_compress()` or any other one-pass compression function,
+ * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize)
+ * as it eliminates one potential failure scenario,
+ * aka not enough room in dst buffer to write the compressed frame.
+ * Note : ZSTD_compressBound() itself can fail, if @srcSize > ZSTD_MAX_INPUT_SIZE .
+ *        In which case, ZSTD_compressBound() will return an error code
+ *        which can be tested using ZSTD_isError().
+ *
+ * ZSTD_COMPRESSBOUND() :
+ * same as ZSTD_compressBound(), but as a macro.
+ * It can be used to produce constants, which can be useful for static allocation,
+ * for example to size a static array on stack.
+ * Will produce constant value 0 if srcSize too large.
+ */
+#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00LLU : 0xFF00FF00U)
+#define ZSTD_COMPRESSBOUND(srcSize)   (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0))  /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */
+size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
+/* ZSTD_isError() :
+ * Most ZSTD_* functions returning a size_t value can be tested for error,
+ * using ZSTD_isError().
+ * @return 1 if error, 0 otherwise
+ */
 unsigned    ZSTD_isError(size_t code);          /*!< tells if a `size_t` function result is an error code */
 const char* ZSTD_getErrorName(size_t code);     /*!< provides readable string from an error code */
 int         ZSTD_minCLevel(void);               /*!< minimum negative compression level allowed, requires v1.4.0+ */
@@ -362,6 +384,8 @@ size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
      * ZSTD_c_useBlockSplitter
      * ZSTD_c_useRowMatchFinder
      * ZSTD_c_prefetchCDictTables
+     * ZSTD_c_enableMatchFinderFallback
+     * ZSTD_c_maxBlockSize
      * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
      * note : never ever use experimentalParam? names directly;
      *        also, the enums values themselves are unstable and can still change.
@@ -381,7 +405,9 @@ size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
      ZSTD_c_experimentalParam13=1010,
      ZSTD_c_experimentalParam14=1011,
      ZSTD_c_experimentalParam15=1012,
-     ZSTD_c_experimentalParam16=1013
+     ZSTD_c_experimentalParam16=1013,
+     ZSTD_c_experimentalParam17=1014,
+     ZSTD_c_experimentalParam18=1015
 } ZSTD_cParameter;
 

typedef struct {
@@ -444,7 +470,7 @@ size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
                   They will be used to compress next frame.
                   Resetting session never fails.
   - The parameters : changes all parameters back to "default".
-                  This removes any reference to any dictionary too.
+                  This also removes any reference to any dictionary or external matchfinder.
                   Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing)
                   otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError())
   - Both : similar to resetting the session, followed by resetting parameters.
@@ -483,13 +509,15 @@ size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
      * ZSTD_d_stableOutBuffer
      * ZSTD_d_forceIgnoreChecksum
      * ZSTD_d_refMultipleDDicts
+     * ZSTD_d_disableHuffmanAssembly
      * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
      * note : never ever use experimentalParam? names directly
      */
      ZSTD_d_experimentalParam1=1000,
      ZSTD_d_experimentalParam2=1001,
      ZSTD_d_experimentalParam3=1002,
-     ZSTD_d_experimentalParam4=1003
+     ZSTD_d_experimentalParam4=1003,
+     ZSTD_d_experimentalParam5=1004
 
 } ZSTD_dParameter;
 

@@ -658,6 +686,9 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); + + Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API + to compress with a dictionary.


@@ -693,6 +724,33 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); size_t ZSTD_freeDStream(ZSTD_DStream* zds);
/* accept NULL pointer */

Streaming decompression functions


+
size_t ZSTD_initDStream(ZSTD_DStream* zds);
+

Initialize/reset DStream state for new decompression operation. + Call before new decompression operation using same DStream. + + Note : This function is redundant with the advanced API and equivalent to: + ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); + ZSTD_DCtx_refDDict(zds, NULL); + +


+ +
size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
+

Streaming decompression function. + Call repetitively to consume full input updating it as necessary. + Function will update both input and output `pos` fields exposing current state via these fields: + - `input.pos < input.size`, some input remaining and caller should provide remaining input + on the next call. + - `output.pos < output.size`, decoder finished and flushed all remaining buffers. + - `output.pos == output.size`, potentially uncflushed data present in the internal buffers, + call ZSTD_decompressStream() again to flush remaining data to output. + Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX. + + @return : 0 when a frame is completely decoded and fully flushed, + or an error code, which can be tested using ZSTD_isError(), + or any other value > 0, which means there is some decoding or flushing to do to complete current frame. + +


+
size_t ZSTD_DStreamInSize(void);    /*!< recommended size for input buffer */
 

size_t ZSTD_DStreamOutSize(void);   /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */
@@ -818,8 +876,9 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds);  /* accept NULL pointer */
  @result : 0, or an error code (which can be tested with ZSTD_isError()).
   Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary,
            meaning "return to no-dictionary mode".
-  Note 1 : Dictionary is sticky, it will be used for all future compressed frames.
-           To return to "no-dictionary" situation, load a NULL dictionary (or reset parameters).
+  Note 1 : Dictionary is sticky, it will be used for all future compressed frames,
+           until parameters are reset, a new dictionary is loaded, or the dictionary
+           is explicitly invalidated by loading a NULL dictionary.
   Note 2 : Loading a dictionary involves building tables.
            It's also a CPU consuming operation, with non-negligible impact on latency.
            Tables are dependent on compression parameters, and for this reason,
@@ -832,7 +891,7 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds);  /* accept NULL pointer */
 


size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
-

Reference a prepared dictionary, to be used for all next compressed frames. +

Reference a prepared dictionary, to be used for all future compressed frames. Note that compression parameters are enforced from within CDict, and supersede any compression parameter previously set within CCtx. The parameters ignored are labelled as "superseded-by-cdict" in the ZSTD_cParameter enum docs. @@ -867,9 +926,9 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */


size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
-

Create an internal DDict from dict buffer, - to be used to decompress next frames. - The dictionary remains valid for all future frames, until explicitly invalidated. +

Create an internal DDict from dict buffer, to be used to decompress all future frames. + The dictionary remains valid for all future frames, until explicitly invalidated, or + a new dictionary is loaded. @result : 0, or an error code (which can be tested with ZSTD_isError()). Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary, meaning "return to no-dictionary mode". @@ -893,9 +952,10 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */ The memory for the table is allocated on the first call to refDDict, and can be freed with ZSTD_freeDCtx(). + If called with ZSTD_d_refMultipleDDicts disabled (the default), only one dictionary + will be managed, and referencing a dictionary effectively "discards" any previous one. + @result : 0, or an error code (which can be tested with ZSTD_isError()). - Note 1 : Currently, only one dictionary can be managed. - Referencing a new dictionary effectively "discards" any previous one. Special: referencing a NULL DDict means "return to no-dictionary mode". Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx. @@ -1131,11 +1191,65 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); or an error code (if srcSize is too small)


+
ZSTDLIB_STATIC_API size_t ZSTD_decompressionMargin(const void* src, size_t srcSize);
+

Zstd supports in-place decompression, where the input and output buffers overlap. + In this case, the output buffer must be at least (Margin + Output_Size) bytes large, + and the input buffer must be at the end of the output buffer. + + _______________________ Output Buffer ________________________ + | | + | ____ Input Buffer ____| + | | | + v v v + |---------------------------------------|-----------|----------| + ^ ^ ^ + |___________________ Output_Size ___________________|_ Margin _| + + NOTE: See also ZSTD_DECOMPRESSION_MARGIN(). + NOTE: This applies only to single-pass decompression through ZSTD_decompress() or + ZSTD_decompressDCtx(). + NOTE: This function supports multi-frame input. + + @param src The compressed frame(s) + @param srcSize The size of the compressed frame(s) + @returns The decompression margin or an error that can be checked with ZSTD_isError(). + +


+ +
#define ZSTD_DECOMPRESSION_MARGIN(originalSize, blockSize) ((size_t)(                                              \
+        ZSTD_FRAMEHEADERSIZE_MAX                                                              /* Frame header */ + \
+        4                                                                                         /* checksum */ + \
+        ((originalSize) == 0 ? 0 : 3 * (((originalSize) + (blockSize) - 1) / blockSize)) /* 3 bytes per block */ + \
+        (blockSize)                                                                    /* One block of margin */   \
+    ))
+

Similar to ZSTD_decompressionMargin(), but instead of computing the margin from + the compressed frame, compute it from the original size and the blockSizeLog. + See ZSTD_decompressionMargin() for details. + + WARNING: This macro does not support multi-frame input, the input must be a single + zstd frame. If you need that support use the function, or implement it yourself. + + @param originalSize The original uncompressed size of the data. + @param blockSize The block size == MIN(windowSize, ZSTD_BLOCKSIZE_MAX). + Unless you explicitly set the windowLog smaller than + ZSTD_BLOCKSIZELOG_MAX you can just use ZSTD_BLOCKSIZE_MAX. + +


+
typedef enum {
   ZSTD_sf_noBlockDelimiters = 0,         /* Representation of ZSTD_Sequence has no block delimiters, sequences only */
   ZSTD_sf_explicitBlockDelimiters = 1    /* Representation of ZSTD_Sequence contains explicit block delimiters */
 } ZSTD_sequenceFormat_e;
 

+
ZSTDLIB_STATIC_API size_t ZSTD_sequenceBound(size_t srcSize);
+

`srcSize` : size of the input buffer + @return : upper-bound for the number of sequences that can be generated + from a buffer of srcSize bytes + + note : returns number of sequences - to get bytes, multiply by sizeof(ZSTD_Sequence). + +


+

Generate sequences using ZSTD_compress2(), given a source buffer. Each block will end with a dummy sequence @@ -1260,8 +1374,11 @@ ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void); and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter(). Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits. - Note 2 : only single-threaded compression is supported. + Note : only single-threaded compression is supported. ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + + Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the external matchfinder API at this time. + Size estimates assume that no external matchfinder is registered.


@@ -1281,7 +1398,12 @@ ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, si or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); Note : if streaming is init with function ZSTD_init?Stream_usingDict(), an internal ?Dict will be created, which additional size is not estimated here. - In this case, get total size by adding ZSTD_estimate?DictSize + In this case, get total size by adding ZSTD_estimate?DictSize + Note 2 : only single-threaded compression is supported. + ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. + Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the external matchfinder API at this time. + Size estimates assume that no external matchfinder is registered. +


ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel);
@@ -1381,20 +1503,27 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPo
   This function never fails (wide contract) 
 


-
ZSTDLIB_STATIC_API
-ZSTD_DEPRECATED("use ZSTD_compress2")
+
ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams);
+

Set all parameters provided within @cparams into the working @cctx. + Note : if modifying parameters during compression (MT mode only), + note that changes to the .windowLog parameter will be ignored. + @return 0 on success, or an error code (can be checked with ZSTD_isError()) +


+ +
ZSTD_DEPRECATED("use ZSTD_compress2")
+ZSTDLIB_STATIC_API
 size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
-                              void* dst, size_t dstCapacity,
-                        const void* src, size_t srcSize,
-                        const void* dict,size_t dictSize,
-                              ZSTD_parameters params);
+                  void* dst, size_t dstCapacity,
+            const void* src, size_t srcSize,
+            const void* dict,size_t dictSize,
+                  ZSTD_parameters params);
 

Note : this function is now DEPRECATED. It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters. This prototype will generate compilation warnings.


-
ZSTDLIB_STATIC_API
-ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary")
+
ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary")
+ZSTDLIB_STATIC_API
 size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
                                   void* dst, size_t dstCapacity,
                             const void* src, size_t srcSize,
@@ -1555,8 +1684,8 @@ ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);  /*
  
 


-
ZSTDLIB_STATIC_API
-ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead")
+
ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead")
+ZSTDLIB_STATIC_API
 size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
 

This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter(). Instruct the decoder context about what kind of data to decode next. @@ -1582,8 +1711,8 @@ size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);

Advanced Streaming compression functions


-
ZSTDLIB_STATIC_API
-ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+
ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+ZSTDLIB_STATIC_API
 size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
              int compressionLevel,
              unsigned long long pledgedSrcSize);
@@ -1600,8 +1729,8 @@ size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
  
 


-
ZSTDLIB_STATIC_API
-ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+
ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+ZSTDLIB_STATIC_API
 size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
          const void* dict, size_t dictSize,
                int compressionLevel);
@@ -1618,8 +1747,8 @@ size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
  
 


-
ZSTDLIB_STATIC_API
-ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+
ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+ZSTDLIB_STATIC_API
 size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
         const void* dict, size_t dictSize,
               ZSTD_parameters params,
@@ -1640,8 +1769,8 @@ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
  
 


-
ZSTDLIB_STATIC_API
-ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
+
ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
+ZSTDLIB_STATIC_API
 size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);
 

This function is DEPRECATED, and equivalent to: ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); @@ -1652,8 +1781,8 @@ size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);


-
ZSTDLIB_STATIC_API
-ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
+
ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
+ZSTDLIB_STATIC_API
 size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
                    const ZSTD_CDict* cdict,
                          ZSTD_frameParameters fParams,
@@ -1674,8 +1803,8 @@ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
  
 


-
ZSTDLIB_STATIC_API
-ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+
ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
+ZSTDLIB_STATIC_API
 size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
 

This function is DEPRECATED, and is equivalent to: ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); @@ -1721,32 +1850,32 @@ size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);


Advanced Streaming decompression functions


-
ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize);
+
ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_loadDictionary, see zstd.h for detailed instructions")
+ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize);
 

ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); ZSTD_DCtx_loadDictionary(zds, dict, dictSize); note: no dictionary will be used if dict == NULL or dictSize < 8 - Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x


-
ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict);
+
ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_refDDict, see zstd.h for detailed instructions")
+ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict);
 

ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); ZSTD_DCtx_refDDict(zds, ddict); note : ddict is referenced, it must outlive decompression session - Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x


-
ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
+
ZSTD_DEPRECATED("use ZSTD_DCtx_reset, see zstd.h for detailed instructions")
+ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
 

ZSTD_DCtx_reset(zds, ZSTD_reset_session_only); re-use decompression parameters from previous init; saves dictionary loading - Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x


@@ -1764,7 +1893,6 @@ size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize); Start by initializing a context. Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression. - It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx() Then, consume your input using ZSTD_compressContinue(). There are some important considerations to keep in mind when using this advanced function : @@ -1788,8 +1916,9 @@ size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);

Buffer-less streaming compression functions

ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
 ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
 ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */
-ZSTDLIB_STATIC_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**<  note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */
 

+
size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**<  note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */
+

size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */
 

Buffer-less streaming decompression (synchronous mode)

@@ -1801,8 +1930,8 @@ ZSTDLIB_STATIC_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* prepar
   Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough.
   Data fragment must be large enough to ensure successful decoding.
  `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough.
-  @result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.
-           >0 : `srcSize` is too small, please provide at least @result bytes on next attempt.
+  result  : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.
+           >0 : `srcSize` is too small, please provide at least result bytes on next attempt.
            errorCode, which can be tested using ZSTD_isError().
 
   It fills a ZSTD_frameHeader structure with important information to correctly decode the frame,
@@ -1821,7 +1950,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* prepar
 
   The most memory efficient way is to use a round buffer of sufficient size.
   Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(),
-  which can @return an error code if required value is too large for current system (in 32-bits mode).
+  which can return an error code if required value is too large for current system (in 32-bits mode).
   In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one,
   up to the moment there is not enough room left in the buffer to guarantee decoding another full block,
   which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`.
@@ -1841,7 +1970,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* prepar
   ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue().
   ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail.
 
- @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
+  result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
   It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item.
   It can also be an error code, which can be tested with ZSTD_isError().
 
@@ -1872,6 +2001,8 @@ typedef struct {
     unsigned headerSize;
     unsigned dictID;
     unsigned checksumFlag;
+    unsigned _reserved1;
+    unsigned _reserved2;
 } ZSTD_frameHeader;
 

ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize);   /**< doesn't consume input */
@@ -1899,7 +2030,6 @@ ZSTDLIB_STATIC_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowS
     - It is necessary to init context before starting
       + compression : any ZSTD_compressBegin*() variant, including with dictionary
       + decompression : any ZSTD_decompressBegin*() variant, including with dictionary
-      + copyCCtx() and copyDCtx() can be used too
     - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB
       + If input is larger than a block size, it's necessary to split input data into multiple blocks
       + For inputs larger than a single block, consider using regular ZSTD_compress() instead.
@@ -1920,5 +2050,33 @@ ZSTDLIB_STATIC_API size_t ZSTD_compressBlock  (ZSTD_CCtx* cctx, void* dst, size_
 ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
 ZSTDLIB_STATIC_API size_t ZSTD_insertBlock    (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize);  /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */
 

+
ZSTDLIB_STATIC_API void
+ZSTD_registerExternalMatchFinder(
+  ZSTD_CCtx* cctx,
+  void* externalMatchState,
+  ZSTD_externalMatchFinder_F* externalMatchFinder
+);
+

Instruct zstd to use an external matchfinder function. + + The externalMatchState must be initialized by the caller, and the caller is + responsible for managing its lifetime. This parameter is sticky across + compressions. It will remain set until the user explicitly resets compression + parameters. + + External matchfinder registration is considered to be an "advanced parameter", + part of the "advanced API". This means it will only have an effect on + compression APIs which respect advanced parameters, such as compress2() and + compressStream(). Older compression APIs such as compressCCtx(), which predate + the introduction of "advanced parameters", will ignore any external matchfinder + setting. + + The external matchfinder can be "cleared" by registering a NULL external + matchfinder function pointer. This removes all limitations described above in + the "LIMITATIONS" section of the API docs. + + The user is strongly encouraged to read the full API documentation (above) + before calling this function. +


+ diff --git a/lib/zstd.h b/lib/zstd.h index d9e26ee13..237142289 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -14,7 +14,7 @@ extern "C" { #ifndef ZSTD_H_235446 #define ZSTD_H_235446 -/* ====== Dependency ======*/ +/* ====== Dependencies ======*/ #include /* INT_MAX */ #include /* size_t */ @@ -106,7 +106,7 @@ extern "C" { /*------ Version ------*/ #define ZSTD_VERSION_MAJOR 1 #define ZSTD_VERSION_MINOR 5 -#define ZSTD_VERSION_RELEASE 3 +#define ZSTD_VERSION_RELEASE 4 #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) /*! ZSTD_versionNumber() : @@ -1646,7 +1646,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void); * or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame(); * Note : if streaming is init with function ZSTD_init?Stream_usingDict(), * an internal ?Dict will be created, which additional size is not estimated here. - * In this case, get total size by adding ZSTD_estimate?DictSize + * In this case, get total size by adding ZSTD_estimate?DictSize * Note 2 : only single-threaded compression is supported. * ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. * Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the external matchfinder API at this time. From af09777b2488ec3af191e541ebe4fc220316ffa8 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 31 Jan 2023 08:59:27 -0800 Subject: [PATCH 447/472] ensure that benchmark mode can only be invoked with zstd format fix #3463 --- programs/zstdcli.c | 38 ++++++++++++++++++++++++-------------- tests/playTests.sh | 6 ++++++ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 39f8b34fe..660e66bb6 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -852,6 +852,7 @@ int main(int argCount, const char* argv[]) contentSize=1, removeSrcFile=0; ZSTD_paramSwitch_e useRowMatchFinder = ZSTD_ps_auto; + FIO_compressionType_t cType = FIO_zstdCompression; unsigned nbWorkers = 0; double compressibility = 0.5; unsigned bench_nbSeconds = 3; /* would be better if this value was synchronized from bench */ @@ -911,17 +912,17 @@ int main(int argCount, const char* argv[]) if (exeNameMatch(programName, ZSTD_CAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; FIO_setPassThroughFlag(prefs, 1); outFileName=stdoutmark; g_displayLevel=1; } /* supports multiple formats */ if (exeNameMatch(programName, ZSTD_ZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; FIO_setPassThroughFlag(prefs, 1); outFileName=stdoutmark; g_displayLevel=1; } /* behave like zcat, also supports multiple formats */ if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ - suffix = GZ_EXTENSION; FIO_setCompressionType(prefs, FIO_gzipCompression); removeSrcFile=1; + suffix = GZ_EXTENSION; cType = FIO_gzipCompression; removeSrcFile=1; dictCLevel = cLevel = 6; /* gzip default is -6 */ } if (exeNameMatch(programName, ZSTD_GUNZIP)) { operation=zom_decompress; removeSrcFile=1; } /* behave like gunzip, also supports multiple formats */ if (exeNameMatch(programName, ZSTD_GZCAT)) { operation=zom_decompress; FIO_overwriteMode(prefs); forceStdout=1; followLinks=1; FIO_setPassThroughFlag(prefs, 1); outFileName=stdoutmark; g_displayLevel=1; } /* behave like gzcat, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_LZMA)) { suffix = LZMA_EXTENSION; FIO_setCompressionType(prefs, FIO_lzmaCompression); removeSrcFile=1; } /* behave like lzma */ - if (exeNameMatch(programName, ZSTD_UNLZMA)) { operation=zom_decompress; FIO_setCompressionType(prefs, FIO_lzmaCompression); removeSrcFile=1; } /* behave like unlzma, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_XZ)) { suffix = XZ_EXTENSION; FIO_setCompressionType(prefs, FIO_xzCompression); removeSrcFile=1; } /* behave like xz */ - if (exeNameMatch(programName, ZSTD_UNXZ)) { operation=zom_decompress; FIO_setCompressionType(prefs, FIO_xzCompression); removeSrcFile=1; } /* behave like unxz, also supports multiple formats */ - if (exeNameMatch(programName, ZSTD_LZ4)) { suffix = LZ4_EXTENSION; FIO_setCompressionType(prefs, FIO_lz4Compression); } /* behave like lz4 */ - if (exeNameMatch(programName, ZSTD_UNLZ4)) { operation=zom_decompress; FIO_setCompressionType(prefs, FIO_lz4Compression); } /* behave like unlz4, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_LZMA)) { suffix = LZMA_EXTENSION; cType = FIO_lzmaCompression; removeSrcFile=1; } /* behave like lzma */ + if (exeNameMatch(programName, ZSTD_UNLZMA)) { operation=zom_decompress; cType = FIO_lzmaCompression; removeSrcFile=1; } /* behave like unlzma, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_XZ)) { suffix = XZ_EXTENSION; cType = FIO_xzCompression; removeSrcFile=1; } /* behave like xz */ + if (exeNameMatch(programName, ZSTD_UNXZ)) { operation=zom_decompress; cType = FIO_xzCompression; removeSrcFile=1; } /* behave like unxz, also supports multiple formats */ + if (exeNameMatch(programName, ZSTD_LZ4)) { suffix = LZ4_EXTENSION; cType = FIO_lz4Compression; } /* behave like lz4 */ + if (exeNameMatch(programName, ZSTD_UNLZ4)) { operation=zom_decompress; cType = FIO_lz4Compression; } /* behave like unlz4, also supports multiple formats */ memset(&compressionParams, 0, sizeof(compressionParams)); /* init crash handler */ @@ -982,20 +983,20 @@ int main(int argCount, const char* argv[]) if (!strcmp(argument, "--row-match-finder")) { useRowMatchFinder = ZSTD_ps_enable; continue; } if (longCommandWArg(&argument, "--adapt=")) { adapt = 1; if (!parseAdaptParameters(argument, &adaptMin, &adaptMax)) { badusage(programName); CLEAN_RETURN(1); } continue; } if (!strcmp(argument, "--single-thread")) { nbWorkers = 0; singleThread = 1; continue; } - if (!strcmp(argument, "--format=zstd")) { suffix = ZSTD_EXTENSION; FIO_setCompressionType(prefs, FIO_zstdCompression); continue; } + if (!strcmp(argument, "--format=zstd")) { suffix = ZSTD_EXTENSION; cType = FIO_zstdCompression; continue; } #ifdef ZSTD_GZCOMPRESS - if (!strcmp(argument, "--format=gzip")) { suffix = GZ_EXTENSION; FIO_setCompressionType(prefs, FIO_gzipCompression); continue; } + if (!strcmp(argument, "--format=gzip")) { suffix = GZ_EXTENSION; cType = FIO_gzipCompression; continue; } if (exeNameMatch(programName, ZSTD_GZ)) { /* behave like gzip */ if (!strcmp(argument, "--best")) { dictCLevel = cLevel = 9; continue; } if (!strcmp(argument, "--no-name")) { /* ignore for now */; continue; } } #endif #ifdef ZSTD_LZMACOMPRESS - if (!strcmp(argument, "--format=lzma")) { suffix = LZMA_EXTENSION; FIO_setCompressionType(prefs, FIO_lzmaCompression); continue; } - if (!strcmp(argument, "--format=xz")) { suffix = XZ_EXTENSION; FIO_setCompressionType(prefs, FIO_xzCompression); continue; } + if (!strcmp(argument, "--format=lzma")) { suffix = LZMA_EXTENSION; cType = FIO_lzmaCompression; continue; } + if (!strcmp(argument, "--format=xz")) { suffix = XZ_EXTENSION; cType = FIO_xzCompression; continue; } #endif #ifdef ZSTD_LZ4COMPRESS - if (!strcmp(argument, "--format=lz4")) { suffix = LZ4_EXTENSION; FIO_setCompressionType(prefs, FIO_lz4Compression); continue; } + if (!strcmp(argument, "--format=lz4")) { suffix = LZ4_EXTENSION; cType = FIO_lz4Compression; continue; } #endif if (!strcmp(argument, "--rsyncable")) { rsyncable = 1; continue; } if (!strcmp(argument, "--compress-literals")) { literalCompressionMode = ZSTD_ps_enable; continue; } @@ -1051,7 +1052,7 @@ int main(int argCount, const char* argv[]) if (longCommandWArg(&argument, "--block-size")) { NEXT_TSIZE(blockSize); continue; } if (longCommandWArg(&argument, "--maxdict")) { NEXT_UINT32(maxDictSize); continue; } if (longCommandWArg(&argument, "--dictID")) { NEXT_UINT32(dictID); continue; } - if (longCommandWArg(&argument, "--zstd=")) { if (!parseCompressionParameters(argument, &compressionParams)) { badusage(programName); CLEAN_RETURN(1); } continue; } + if (longCommandWArg(&argument, "--zstd=")) { if (!parseCompressionParameters(argument, &compressionParams)) { badusage(programName); CLEAN_RETURN(1); } ; cType = FIO_zstdCompression; continue; } if (longCommandWArg(&argument, "--stream-size")) { NEXT_TSIZE(streamSrcSize); continue; } if (longCommandWArg(&argument, "--target-compressed-block-size")) { NEXT_TSIZE(targetCBlockSize); continue; } if (longCommandWArg(&argument, "--size-hint")) { NEXT_TSIZE(srcSizeHint); continue; } @@ -1358,6 +1359,10 @@ int main(int argCount, const char* argv[]) /* Check if benchmark is selected */ if (operation==zom_bench) { #ifndef ZSTD_NOBENCH + if (cType != FIO_zstdCompression) { + DISPLAYLEVEL(1, "benchmark mode is only compatible with zstd format \n"); + CLEAN_RETURN(1); + } benchParams.blockSize = blockSize; benchParams.nbWorkers = (int)nbWorkers; benchParams.realTime = (unsigned)setRealTimePrio; @@ -1529,6 +1534,7 @@ int main(int argCount, const char* argv[]) FIO_setMemLimit(prefs, memLimit); if (operation==zom_compress) { #ifndef ZSTD_NOCOMPRESS + FIO_setCompressionType(prefs, cType); FIO_setContentSize(prefs, contentSize); FIO_setNbWorkers(prefs, (int)nbWorkers); FIO_setBlockSize(prefs, (int)blockSize); @@ -1573,7 +1579,11 @@ int main(int argCount, const char* argv[]) else operationResult = FIO_compressMultipleFilenames(fCtx, prefs, filenames->fileNames, outMirroredDirName, outDirName, outFileName, suffix, dictFileName, cLevel, compressionParams); #else - (void)contentSize; (void)suffix; (void)adapt; (void)rsyncable; (void)ultra; (void)cLevel; (void)ldmFlag; (void)literalCompressionMode; (void)targetCBlockSize; (void)streamSrcSize; (void)srcSizeHint; (void)ZSTD_strategyMap; (void)useRowMatchFinder; /* not used when ZSTD_NOCOMPRESS set */ + /* these variables are only used when compression mode is enabled */ + (void)contentSize; (void)suffix; (void)adapt; (void)rsyncable; + (void)ultra; (void)cLevel; (void)ldmFlag; (void)literalCompressionMode; + (void)targetCBlockSize; (void)streamSrcSize; (void)srcSizeHint; + (void)ZSTD_strategyMap; (void)useRowMatchFinder; (void)cType; DISPLAYLEVEL(1, "Compression not supported \n"); #endif } else { /* decompression or test */ diff --git a/tests/playTests.sh b/tests/playTests.sh index e064c86df..5d78e9e7d 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -1218,6 +1218,12 @@ println "benchmark decompression only" zstd -f tmp1 zstd -b -d -i0 tmp1.zst +GZIPMODE=1 +zstd --format=gzip -V || GZIPMODE=0 +if [ $GZIPMODE -eq 1 ]; then + println "benchmark mode is only compatible with zstd" + zstd --format=gzip -b tmp1 && die "-b should be incompatible with gzip format!" +fi println "\n===> zstd compatibility tests " From 64052ef57d09a9117ccf1c535d3387f0d5270ca9 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 31 Jan 2023 13:55:48 -0500 Subject: [PATCH 448/472] Guard against invalid sequences from external matchfinders (#3465) --- lib/compress/zstd_compress.c | 44 +++++++++++++++++++-------- tests/external_matchfinder.c | 23 ++++++++++++++ tests/external_matchfinder.h | 6 +++- tests/fuzz/zstd_helpers.c | 1 + tests/zstreamtest.c | 59 ++++++++++++++++++++++-------------- 5 files changed, 96 insertions(+), 37 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 579044dc9..de2db8221 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -277,14 +277,8 @@ static ZSTD_paramSwitch_e ZSTD_resolveEnableLdm(ZSTD_paramSwitch_e mode, return (cParams->strategy >= ZSTD_btopt && cParams->windowLog >= 27) ? ZSTD_ps_enable : ZSTD_ps_disable; } -/* Enables validation for external sequences in debug builds. */ static int ZSTD_resolveExternalSequenceValidation(int mode) { -#if defined(DEBUGLEVEL) && (DEBUGLEVEL>=2) - (void)mode; - return 1; -#else return mode; -#endif } /* Resolves maxBlockSize to the default if no value is present. */ @@ -3050,6 +3044,23 @@ static size_t ZSTD_postProcessExternalMatchFinderResult( } } +/* ZSTD_fastSequenceLengthSum() : + * Returns sum(litLen) + sum(matchLen) + lastLits for *seqBuf*. + * Similar to another function in zstd_compress.c (determine_blockSize), + * except it doesn't check for a block delimiter to end summation. + * Removing the early exit allows the compiler to auto-vectorize (https://godbolt.org/z/cY1cajz9P). + * This function can be deleted and replaced by determine_blockSize after we resolve issue #3456. */ +static size_t ZSTD_fastSequenceLengthSum(ZSTD_Sequence const* seqBuf, size_t seqBufSize) { + size_t matchLenSum, litLenSum, i; + matchLenSum = 0; + litLenSum = 0; + for (i = 0; i < seqBufSize; i++) { + litLenSum += seqBuf[i].litLength; + matchLenSum += seqBuf[i].matchLength; + } + return litLenSum + matchLenSum; +} + typedef enum { ZSTDbss_compress, ZSTDbss_noCompress } ZSTD_buildSeqStore_e; static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) @@ -3167,8 +3178,15 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) /* Return early if there is no error, since we don't need to worry about last literals */ if (!ZSTD_isError(nbPostProcessedSeqs)) { ZSTD_sequencePosition seqPos = {0,0,0}; - ZSTD_copySequencesToSeqStoreExplicitBlockDelim( - zc, &seqPos, zc->externalMatchCtx.seqBuffer, nbPostProcessedSeqs, src, srcSize + size_t const seqLenSum = ZSTD_fastSequenceLengthSum(zc->externalMatchCtx.seqBuffer, nbPostProcessedSeqs); + RETURN_ERROR_IF(seqLenSum > srcSize, externalSequences_invalid, "External sequences imply too large a block!"); + FORWARD_IF_ERROR( + ZSTD_copySequencesToSeqStoreExplicitBlockDelim( + zc, &seqPos, + zc->externalMatchCtx.seqBuffer, nbPostProcessedSeqs, + src, srcSize + ), + "Failed to copy external sequences to seqStore!" ); ms->ldmSeqStore = NULL; DEBUGLOG(5, "Copied %lu sequences from external matchfinder to internal seqStore.", (unsigned long)nbExternalSeqs); @@ -6286,7 +6304,7 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ip += inSeqs[idx].litLength; seqPos->posInSrc += inSeqs[idx].litLength; } - RETURN_ERROR_IF(ip != iend, corruption_detected, "Blocksize doesn't agree with block delimiter!"); + RETURN_ERROR_IF(ip != iend, externalSequences_invalid, "Blocksize doesn't agree with block delimiter!"); seqPos->idx = idx+1; return 0; } @@ -6444,13 +6462,13 @@ blockSize_explicitDelimiter(const ZSTD_Sequence* inSeqs, size_t inSeqsSize, ZSTD blockSize += inSeqs[spos].litLength + inSeqs[spos].matchLength; if (end) { if (inSeqs[spos].matchLength != 0) - RETURN_ERROR(corruption_detected, "delimiter format error : both matchlength and offset must be == 0"); + RETURN_ERROR(externalSequences_invalid, "delimiter format error : both matchlength and offset must be == 0"); break; } spos++; } if (!end) - RETURN_ERROR(corruption_detected, "Reached end of sequences without finding a block delimiter"); + RETURN_ERROR(externalSequences_invalid, "Reached end of sequences without finding a block delimiter"); return blockSize; } @@ -6471,9 +6489,9 @@ static size_t determine_blockSize(ZSTD_sequenceFormat_e mode, { size_t const explicitBlockSize = blockSize_explicitDelimiter(inSeqs, inSeqsSize, seqPos); FORWARD_IF_ERROR(explicitBlockSize, "Error while determining block size with explicit delimiters"); if (explicitBlockSize > blockSize) - RETURN_ERROR(corruption_detected, "sequences incorrectly define a too large block"); + RETURN_ERROR(externalSequences_invalid, "sequences incorrectly define a too large block"); if (explicitBlockSize > remaining) - RETURN_ERROR(srcSize_wrong, "sequences define a frame longer than source"); + RETURN_ERROR(externalSequences_invalid, "sequences define a frame longer than source"); return explicitBlockSize; } } diff --git a/tests/external_matchfinder.c b/tests/external_matchfinder.c index 8ae76d519..97c47caff 100644 --- a/tests/external_matchfinder.c +++ b/tests/external_matchfinder.c @@ -108,6 +108,29 @@ size_t zstreamExternalMatchFinder( compressionLevel, windowSize ); + case EMF_INVALID_OFFSET: + outSeqs[0].offset = 1 << 20; + outSeqs[0].matchLength = 4; + outSeqs[0].litLength = (U32)(srcSize - 4); + return 1; + case EMF_INVALID_MATCHLEN: + outSeqs[0].offset = 1; + outSeqs[0].matchLength = (U32)(srcSize); + outSeqs[0].litLength = 1; + return 1; + case EMF_INVALID_LITLEN: + outSeqs[0].offset = 0; + outSeqs[0].matchLength = 0; + outSeqs[0].litLength = (U32)(srcSize + 1); + return 1; + case EMF_INVALID_LAST_LITS: + outSeqs[0].offset = 1; + outSeqs[0].matchLength = 1; + outSeqs[0].litLength = 1; + outSeqs[1].offset = 0; + outSeqs[1].matchLength = 0; + outSeqs[1].litLength = (U32)(srcSize - 1); + return 2; case EMF_SMALL_ERROR: return outSeqsCapacity + 1; case EMF_BIG_ERROR: diff --git a/tests/external_matchfinder.h b/tests/external_matchfinder.h index e4f7c95f0..7550bbceb 100644 --- a/tests/external_matchfinder.h +++ b/tests/external_matchfinder.h @@ -20,7 +20,11 @@ typedef enum { EMF_ONE_BIG_SEQ = 1, EMF_LOTS_OF_SEQS = 2, EMF_BIG_ERROR = 3, - EMF_SMALL_ERROR = 4 + EMF_SMALL_ERROR = 4, + EMF_INVALID_OFFSET = 5, + EMF_INVALID_MATCHLEN = 6, + EMF_INVALID_LITLEN = 7, + EMF_INVALID_LAST_LITS = 8 } EMF_testCase; size_t zstreamExternalMatchFinder( diff --git a/tests/fuzz/zstd_helpers.c b/tests/fuzz/zstd_helpers.c index 43a26405f..310012cb5 100644 --- a/tests/fuzz/zstd_helpers.c +++ b/tests/fuzz/zstd_helpers.c @@ -128,6 +128,7 @@ void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer setRand(cctx, ZSTD_c_deterministicRefPrefix, 0, 1, producer); setRand(cctx, ZSTD_c_prefetchCDictTables, 0, 2, producer); setRand(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX_MIN, ZSTD_BLOCKSIZE_MAX, producer); + setRand(cctx, ZSTD_c_validateSequences, 0, 1, producer); if (FUZZ_dataProducer_uint32Range(producer, 0, 1) == 0) { setRand(cctx, ZSTD_c_srcSizeHint, ZSTD_SRCSIZEHINT_MIN, 2 * srcSize, producer); } diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index db1e25188..aff847b4d 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -1873,48 +1873,61 @@ static int basicUnitTests(U32 seed, double compressibility, int bigTests) * check that the reference is preserved across compressions */ ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder); - for (enableFallback = 0; enableFallback < 1; enableFallback++) { + for (enableFallback = 0; enableFallback <= 1; enableFallback++) { size_t testCaseId; + size_t const numTestCases = 9; - EMF_testCase const EMF_successCases[] = { + EMF_testCase const testCases[] = { EMF_ONE_BIG_SEQ, EMF_LOTS_OF_SEQS, - }; - size_t const EMF_numSuccessCases = 2; - - EMF_testCase const EMF_failureCases[] = { EMF_ZERO_SEQS, EMF_BIG_ERROR, EMF_SMALL_ERROR, + EMF_INVALID_OFFSET, + EMF_INVALID_MATCHLEN, + EMF_INVALID_LITLEN, + EMF_INVALID_LAST_LITS }; - size_t const EMF_numFailureCases = 3; - /* Test external matchfinder success scenarios */ - for (testCaseId = 0; testCaseId < EMF_numSuccessCases; testCaseId++) { + ZSTD_ErrorCode const errorCodes[] = { + ZSTD_error_no_error, + ZSTD_error_no_error, + ZSTD_error_externalMatchFinder_failed, + ZSTD_error_externalMatchFinder_failed, + ZSTD_error_externalMatchFinder_failed, + ZSTD_error_externalSequences_invalid, + ZSTD_error_externalSequences_invalid, + ZSTD_error_externalSequences_invalid, + ZSTD_error_externalSequences_invalid + }; + + for (testCaseId = 0; testCaseId < numTestCases; testCaseId++) { size_t res; - externalMatchState = EMF_successCases[testCaseId]; + + int const compressionShouldSucceed = ( + (errorCodes[testCaseId] == ZSTD_error_no_error) || + (enableFallback && errorCodes[testCaseId] == ZSTD_error_externalMatchFinder_failed) + ); + + int const testWithSequenceValidation = ( + testCases[testCaseId] == EMF_INVALID_OFFSET + ); + + externalMatchState = testCases[testCaseId]; + ZSTD_CCtx_reset(zc, ZSTD_reset_session_only); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_validateSequences, testWithSequenceValidation)); CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, enableFallback)); res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize); - CHECK(ZSTD_isError(res), "EMF: Compression error: %s", ZSTD_getErrorName(res)); - CHECK_Z(ZSTD_decompress(checkBuf, checkBufSize, dstBuf, res)); - CHECK(memcmp(CNBuffer, checkBuf, CNBufferSize) != 0, "EMF: Corruption!"); - } - /* Test external matchfinder failure scenarios */ - for (testCaseId = 0; testCaseId < EMF_numFailureCases; testCaseId++) { - size_t res; - externalMatchState = EMF_failureCases[testCaseId]; - ZSTD_CCtx_reset(zc, ZSTD_reset_session_only); - CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, enableFallback)); - res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize); - if (enableFallback) { + if (compressionShouldSucceed) { + CHECK(ZSTD_isError(res), "EMF: Compression error: %s", ZSTD_getErrorName(res)); CHECK_Z(ZSTD_decompress(checkBuf, checkBufSize, dstBuf, res)); CHECK(memcmp(CNBuffer, checkBuf, CNBufferSize) != 0, "EMF: Corruption!"); } else { CHECK(!ZSTD_isError(res), "EMF: Should have raised an error!"); CHECK( - ZSTD_getErrorCode(res) != ZSTD_error_externalMatchFinder_failed, + ZSTD_getErrorCode(res) != errorCodes[testCaseId], "EMF: Wrong error code: %s", ZSTD_getErrorName(res) ); } From 7f8189ca57741f89b98b06fabfeffb2c8b8683b5 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Tue, 31 Jan 2023 13:51:32 -0800 Subject: [PATCH 449/472] add ZSTD_c_fastExternalSequenceParsing cctxParam --- lib/compress/zstd_compress.c | 79 ++++++++++++++++++++++++--- lib/compress/zstd_compress_internal.h | 7 ++- lib/zstd.h | 40 +++++++++++--- tests/fuzz/zstd_helpers.c | 1 + 4 files changed, 109 insertions(+), 18 deletions(-) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index de2db8221..3ad6f05a2 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -290,6 +290,15 @@ static size_t ZSTD_resolveMaxBlockSize(size_t maxBlockSize) { } } +static ZSTD_paramSwitch_e ZSTD_resolveExternalRepcodeSearch(ZSTD_paramSwitch_e value, int cLevel) { + if (value != ZSTD_ps_auto) return value; + if (cLevel < 10) { + return ZSTD_ps_disable; + } else { + return ZSTD_ps_enable; + } +} + /* Returns 1 if compression parameters are such that CDict hashtable and chaintable indices are tagged. * If so, the tags need to be removed in ZSTD_resetCCtx_byCopyingCDict. */ static int ZSTD_CDictIndicesAreTagged(const ZSTD_compressionParameters* const cParams) { @@ -315,6 +324,8 @@ static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams( cctxParams.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(cctxParams.useRowMatchFinder, &cParams); cctxParams.validateSequences = ZSTD_resolveExternalSequenceValidation(cctxParams.validateSequences); cctxParams.maxBlockSize = ZSTD_resolveMaxBlockSize(cctxParams.maxBlockSize); + cctxParams.searchForExternalRepcodes = ZSTD_resolveExternalRepcodeSearch(cctxParams.searchForExternalRepcodes, + cctxParams.compressionLevel); assert(!ZSTD_checkCParams(cParams)); return cctxParams; } @@ -381,6 +392,7 @@ ZSTD_CCtxParams_init_internal(ZSTD_CCtx_params* cctxParams, cctxParams->ldmParams.enableLdm = ZSTD_resolveEnableLdm(cctxParams->ldmParams.enableLdm, ¶ms->cParams); cctxParams->validateSequences = ZSTD_resolveExternalSequenceValidation(cctxParams->validateSequences); cctxParams->maxBlockSize = ZSTD_resolveMaxBlockSize(cctxParams->maxBlockSize); + cctxParams->searchForExternalRepcodes = ZSTD_resolveExternalRepcodeSearch(cctxParams->searchForExternalRepcodes, compressionLevel); DEBUGLOG(4, "ZSTD_CCtxParams_init_internal: useRowMatchFinder=%d, useBlockSplitter=%d ldm=%d", cctxParams->useRowMatchFinder, cctxParams->useBlockSplitter, cctxParams->ldmParams.enableLdm); } @@ -613,6 +625,11 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) bounds.upperBound = ZSTD_BLOCKSIZE_MAX; return bounds; + case ZSTD_c_searchForExternalRepcodes: + bounds.lowerBound = (int)ZSTD_ps_auto; + bounds.upperBound = (int)ZSTD_ps_disable; + return bounds; + default: bounds.error = ERROR(parameter_unsupported); return bounds; @@ -680,6 +697,7 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param) case ZSTD_c_prefetchCDictTables: case ZSTD_c_enableMatchFinderFallback: case ZSTD_c_maxBlockSize: + case ZSTD_c_searchForExternalRepcodes: default: return 0; } @@ -738,6 +756,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value) case ZSTD_c_prefetchCDictTables: case ZSTD_c_enableMatchFinderFallback: case ZSTD_c_maxBlockSize: + case ZSTD_c_searchForExternalRepcodes: break; default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); @@ -981,6 +1000,11 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, CCtxParams->maxBlockSize = value; return CCtxParams->maxBlockSize; + case ZSTD_c_searchForExternalRepcodes: + BOUNDCHECK(ZSTD_c_searchForExternalRepcodes, value); + CCtxParams->searchForExternalRepcodes = (ZSTD_paramSwitch_e)value; + return CCtxParams->searchForExternalRepcodes; + default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); } } @@ -1122,6 +1146,9 @@ size_t ZSTD_CCtxParams_getParameter( case ZSTD_c_maxBlockSize: *value = (int)CCtxParams->maxBlockSize; break; + case ZSTD_c_searchForExternalRepcodes: + *value = (int)CCtxParams->searchForExternalRepcodes; + break; default: RETURN_ERROR(parameter_unsupported, "unknown parameter"); } return 0; @@ -3184,7 +3211,8 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) ZSTD_copySequencesToSeqStoreExplicitBlockDelim( zc, &seqPos, zc->externalMatchCtx.seqBuffer, nbPostProcessedSeqs, - src, srcSize + src, srcSize, + zc->appliedParams.searchForExternalRepcodes ), "Failed to copy external sequences to seqStore!" ); @@ -6000,6 +6028,7 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, params.useRowMatchFinder = ZSTD_resolveRowMatchFinderMode(params.useRowMatchFinder, ¶ms.cParams); params.validateSequences = ZSTD_resolveExternalSequenceValidation(params.validateSequences); params.maxBlockSize = ZSTD_resolveMaxBlockSize(params.maxBlockSize); + params.searchForExternalRepcodes = ZSTD_resolveExternalRepcodeSearch(params.searchForExternalRepcodes, params.compressionLevel); #ifdef ZSTD_MULTITHREAD /* If external matchfinder is enabled, make sure to fail before checking job size (for consistency) */ @@ -6259,9 +6288,11 @@ size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize) + const void* src, size_t blockSize, + ZSTD_paramSwitch_e externalRepSearch) { U32 idx = seqPos->idx; + U32 const startIdx = idx; BYTE const* ip = (BYTE const*)(src); const BYTE* const iend = ip + blockSize; repcodes_t updatedRepcodes; @@ -6279,10 +6310,16 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZSTD_memcpy(updatedRepcodes.rep, cctx->blockState.prevCBlock->rep, sizeof(repcodes_t)); for (; idx < inSeqsSize && (inSeqs[idx].matchLength != 0 || inSeqs[idx].offset != 0); ++idx) { U32 const litLength = inSeqs[idx].litLength; - U32 const ll0 = (litLength == 0); U32 const matchLength = inSeqs[idx].matchLength; - U32 const offBase = ZSTD_finalizeOffBase(inSeqs[idx].offset, updatedRepcodes.rep, ll0); - ZSTD_updateRep(updatedRepcodes.rep, offBase, ll0); + U32 offBase; + + if (externalRepSearch == ZSTD_ps_disable) { + offBase = OFFSET_TO_OFFBASE(inSeqs[idx].offset); + } else { + U32 const ll0 = (litLength == 0); + offBase = ZSTD_finalizeOffBase(inSeqs[idx].offset, updatedRepcodes.rep, ll0); + ZSTD_updateRep(updatedRepcodes.rep, offBase, ll0); + } DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offBase, matchLength, litLength); if (cctx->appliedParams.validateSequences) { @@ -6296,6 +6333,29 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZSTD_storeSeq(&cctx->seqStore, litLength, ip, iend, offBase, matchLength); ip += matchLength + litLength; } + + /* If we skipped repcode search while parsing, we need to update repcodes now */ + assert(idx >= startIdx); + if (externalRepSearch == ZSTD_ps_disable && idx != startIdx) { + U32* const rep = updatedRepcodes.rep; + U32 lastSeqIdx = idx - 1; /* index of last non-block-delimiter sequence */ + + if (lastSeqIdx >= startIdx + 2) { + rep[2] = inSeqs[lastSeqIdx - 2].offset; + rep[1] = inSeqs[lastSeqIdx - 1].offset; + rep[0] = inSeqs[lastSeqIdx].offset; + } else if (lastSeqIdx == startIdx + 1) { + rep[2] = rep[0]; + rep[1] = inSeqs[lastSeqIdx - 1].offset; + rep[0] = inSeqs[lastSeqIdx].offset; + } else { + assert(lastSeqIdx == startIdx); + rep[2] = rep[1]; + rep[1] = rep[0]; + rep[0] = inSeqs[lastSeqIdx].offset; + } + } + ZSTD_memcpy(cctx->blockState.nextCBlock->rep, updatedRepcodes.rep, sizeof(repcodes_t)); if (inSeqs[idx].litLength) { @@ -6312,7 +6372,7 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize) + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch) { U32 idx = seqPos->idx; U32 startPosInSequence = seqPos->posInSequence; @@ -6324,6 +6384,9 @@ ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* U32 bytesAdjustment = 0; U32 finalMatchSplit = 0; + /* TODO(embg) support fast parsing mode in noBlockDelim mode */ + (void)externalRepSearch; + if (cctx->cdict) { dictSize = cctx->cdict->dictContentSize; } else if (cctx->prefixDict.dict) { @@ -6431,7 +6494,7 @@ ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* typedef size_t (*ZSTD_sequenceCopier) (ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize); + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch); static ZSTD_sequenceCopier ZSTD_selectSequenceCopier(ZSTD_sequenceFormat_e mode) { ZSTD_sequenceCopier sequenceCopier = NULL; @@ -6539,7 +6602,7 @@ ZSTD_compressSequences_internal(ZSTD_CCtx* cctx, ZSTD_resetSeqStore(&cctx->seqStore); DEBUGLOG(5, "Working on new block. Blocksize: %zu (total:%zu)", blockSize, (ip - (const BYTE*)src) + blockSize); - additionalByteAdjustment = sequenceCopier(cctx, &seqPos, inSeqs, inSeqsSize, ip, blockSize); + additionalByteAdjustment = sequenceCopier(cctx, &seqPos, inSeqs, inSeqsSize, ip, blockSize, cctx->appliedParams.searchForExternalRepcodes); FORWARD_IF_ERROR(additionalByteAdjustment, "Bad sequence copy"); blockSize -= additionalByteAdjustment; diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 79068bcb8..dac7a0aa2 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -358,6 +358,9 @@ struct ZSTD_CCtx_params_s { /* Adjust the max block size*/ size_t maxBlockSize; + + /* Controls repcode search in external sequence parsing */ + ZSTD_paramSwitch_e searchForExternalRepcodes; }; /* typedef'd to ZSTD_CCtx_params within "zstd.h" */ #define COMPRESS_SEQUENCES_WORKSPACE_SIZE (sizeof(unsigned) * (MaxSeq + 2)) @@ -1453,7 +1456,7 @@ size_t ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize); + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch); /* Returns the number of bytes to move the current read position back by. * Only non-zero if we ended up splitting a sequence. @@ -1470,6 +1473,6 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, size_t ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t inSeqsSize, - const void* src, size_t blockSize); + const void* src, size_t blockSize, ZSTD_paramSwitch_e externalRepSearch); #endif /* ZSTD_COMPRESS_H */ diff --git a/lib/zstd.h b/lib/zstd.h index 237142289..91a3679a1 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -501,7 +501,8 @@ typedef enum { ZSTD_c_experimentalParam15=1012, ZSTD_c_experimentalParam16=1013, ZSTD_c_experimentalParam17=1014, - ZSTD_c_experimentalParam18=1015 + ZSTD_c_experimentalParam18=1015, + ZSTD_c_experimentalParam19=1016 } ZSTD_cParameter; typedef struct { @@ -2126,18 +2127,41 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo * documentation (below) before setting this parameter. */ #define ZSTD_c_enableMatchFinderFallback ZSTD_c_experimentalParam17 -/* ZSTD_c_maxBlockSize - * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB). - * The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default. +/* ZSTD_c_maxBlockSize + * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB). + * The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default. * - * This parameter can be used to set an upper bound on the blocksize - * that overrides the default ZSTD_BLOCKSIZE_MAX. It cannot be used to set upper - * bounds greater than ZSTD_BLOCKSIZE_MAX or bounds lower than 1KB (will make - * compressBound() innacurate). Only currently meant to be used for testing. + * This parameter can be used to set an upper bound on the blocksize + * that overrides the default ZSTD_BLOCKSIZE_MAX. It cannot be used to set upper + * bounds greater than ZSTD_BLOCKSIZE_MAX or bounds lower than 1KB (will make + * compressBound() innacurate). Only currently meant to be used for testing. * */ #define ZSTD_c_maxBlockSize ZSTD_c_experimentalParam18 +/* ZSTD_c_searchForExternalRepcodes + * This parameter affects how zstd parses external sequences, such as sequences + * provided through the compressSequences() API or from an external matchfinder. + * + * If set to ZSTD_ps_enable, the library will check for repeated offsets in + * external sequences, even if those repcodes are not explicitly indicated in + * the "rep" field. Note that this is the only way to exploit repcode matches + * while using compressSequences() or an external matchfinder, since zstd + * currently ignores the "rep" field of external sequences. + * + * If set to ZSTD_ps_disable, the library will not exploit repeated offsets in + * external sequences, regardless of whether the "rep" field has been set. This + * reduces sequence compression overhead by about 25% while sacrificing some + * compression ratio. + * + * The default value is ZSTD_ps_auto, for which the library will enable/disable + * based on compression level. + * + * Note: for now, this param only has an effect if ZSTD_c_blockDelimiters is + * set to ZSTD_sf_explicitBlockDelimiters. That may change in the future. + */ +#define ZSTD_c_searchForExternalRepcodes ZSTD_c_experimentalParam19 + /*! ZSTD_CCtx_getParameter() : * Get the requested compression parameter value, selected by enum ZSTD_cParameter, * and store it into int* value. diff --git a/tests/fuzz/zstd_helpers.c b/tests/fuzz/zstd_helpers.c index 310012cb5..6b833471e 100644 --- a/tests/fuzz/zstd_helpers.c +++ b/tests/fuzz/zstd_helpers.c @@ -129,6 +129,7 @@ void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer setRand(cctx, ZSTD_c_prefetchCDictTables, 0, 2, producer); setRand(cctx, ZSTD_c_maxBlockSize, ZSTD_BLOCKSIZE_MAX_MIN, ZSTD_BLOCKSIZE_MAX, producer); setRand(cctx, ZSTD_c_validateSequences, 0, 1, producer); + setRand(cctx, ZSTD_c_searchForExternalRepcodes, 0, 2, producer); if (FUZZ_dataProducer_uint32Range(producer, 0, 1) == 0) { setRand(cctx, ZSTD_c_srcSizeHint, ZSTD_SRCSIZEHINT_MIN, 2 * srcSize, producer); } From cc3e3acd3415cfb14aad5fbe4e819fcf20760e8f Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Wed, 1 Feb 2023 16:38:36 -0800 Subject: [PATCH 450/472] Fix 32-bit decoding with large dictionary The 32-bit decoder could corrupt the regenerated data by using regular offset mode when there were actually long offsets. This is because we were only considering the window size in the calculation, not the dictionary size. So a large dictionary could allow longer offsets. Fix this in two ways: 1. Instead of looking at the window size, look at the total referencable bytes in the history buffer. Use this in the comparison instead of the window size. Additionally, we were comparing against the wrong value, it was too low. Fix that by computing exactly the maximum offset for regular sequence decoding. 2. If it is possible that we have long offsets due to (1), then check the offset code decoding table, and if the decoding table's maximum number of additional bits is no more than STREAM_ACCUMULATOR_MIN, then we can't have long offsets. This gates us to be using the long offsets decoder only when we are very likely to actually have long offsets. Note that this bug only affects the decoding of the data, and the original compressed data, if re-read with a patched decoder, will correctly regenerate the orginal data. Except that the encoder also had the same issue previously. This fixes both the open OSS-Fuzz issues. Credit to OSS-Fuzz --- lib/decompress/zstd_decompress_block.c | 125 +++++++++++++++++++------ 1 file changed, 96 insertions(+), 29 deletions(-) diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index a2a6eb3ed..f8a7963a9 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -1170,7 +1170,7 @@ ZSTD_updateFseStateWithDInfo(ZSTD_fseState* DStatePtr, BIT_DStream_t* bitD, U16 } /* We need to add at most (ZSTD_WINDOWLOG_MAX_32 - 1) bits to read the maximum - * offset bits. But we can only read at most (STREAM_ACCUMULATOR_MIN_32 - 1) + * offset bits. But we can only read at most STREAM_ACCUMULATOR_MIN_32 * bits before reloading. This value is the maximum number of bytes we read * after reloading when we are decoding long offsets. */ @@ -1986,34 +1986,74 @@ ZSTD_decompressSequencesLong(ZSTD_DCtx* dctx, #endif /* ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT */ +/** + * @returns The total size of the history referencable by zstd, including + * both the prefix and the extDict. At @p op any offset larger than this + * is invalid. + */ +static size_t ZSTD_totalHistorySize(BYTE* op, BYTE const* virtualStart) +{ + return (size_t)(op - virtualStart); +} -#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ - !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) -/* ZSTD_getLongOffsetsShare() : +typedef struct { + unsigned longOffsetShare; + unsigned maxNbAdditionalBits; +} ZSTD_OffsetInfo; + +/* ZSTD_getOffsetInfo() : * condition : offTable must be valid * @return : "share" of long offsets (arbitrarily defined as > (1<<23)) - * compared to maximum possible of (1< 22) total += 1; + info.maxNbAdditionalBits = MAX(info.maxNbAdditionalBits, table[u].nbAdditionalBits); + if (table[u].nbAdditionalBits > 22) info.longOffsetShare += 1; } assert(tableLog <= OffFSELog); - total <<= (OffFSELog - tableLog); /* scale to OffFSELog */ + info.longOffsetShare <<= (OffFSELog - tableLog); /* scale to OffFSELog */ - return total; + return info; +} + +/** + * @returns The maximum offset we can decode in one read of our bitstream, without + * reloading more bits in the middle of the offset bits read. Any offsets larger + * than this must use the long offset decoder. + */ +static size_t ZSTD_maxShortOffset(void) +{ + if (MEM_64bits()) { + /* We can decode any offset without reloading bits. + * This might change if the max window size grows. + */ + ZSTD_STATIC_ASSERT(ZSTD_WINDOWLOG_MAX <= 31); + return (size_t)-1; + } else { + /* The maximum offBase is (1 << (STREAM_ACCUMULATOR_MIN + 1)) - 1. + * This offBase would require STREAM_ACCUMULATOR_MIN extra bits. + * Then we have to subtract ZSTD_REP_NUM to get the maximum possible offset. + */ + size_t const maxOffbase = ((size_t)1 << (STREAM_ACCUMULATOR_MIN + 1)) - 1; + size_t const maxOffset = maxOffbase - ZSTD_REP_NUM; + assert(ZSTD_highbit32((U32)maxOffbase) == STREAM_ACCUMULATOR_MIN); + return maxOffset; + } } -#endif size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, @@ -2021,13 +2061,6 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, const void* src, size_t srcSize, const int frame, const streaming_operation streaming) { /* blockType == blockCompressed */ const BYTE* ip = (const BYTE*)src; - /* isLongOffset must be true if there are long offsets. - * Offsets are long if they are larger than 2^STREAM_ACCUMULATOR_MIN. - * We don't expect that to be the case in 64-bit mode. - * In block mode, window size is not known, so we have to be conservative. - * (note: it could possibly be evaluated from current-lowLimit) - */ - ZSTD_longOffset_e const isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (!frame || (dctx->fParams.windowSize > (1ULL << STREAM_ACCUMULATOR_MIN)))); DEBUGLOG(5, "ZSTD_decompressBlock_internal (size : %u)", (U32)srcSize); /* Note : the wording of the specification @@ -2050,6 +2083,23 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, /* Build Decoding Tables */ { + /* Compute the maximum block size, which must also work when !frame and fParams are unset. + * Additionally, take the min with dstCapacity to ensure that the totalHistorySize fits in a size_t. + */ + size_t const blockSizeMax = MIN(dstCapacity, (frame ? dctx->fParams.blockSizeMax : ZSTD_BLOCKSIZE_MAX)); + size_t const totalHistorySize = ZSTD_totalHistorySize((BYTE*)dst + blockSizeMax, (BYTE const*)dctx->virtualStart); + /* isLongOffset must be true if there are long offsets. + * Offsets are long if they are larger than ZSTD_maxShortOffset(). + * We don't expect that to be the case in 64-bit mode. + * + * We check here to see if our history is large enough to allow long offsets. + * If it isn't, then we can't possible have (valid) long offsets. If the offset + * is invalid, then it is okay to read it incorrectly. + * + * If isLongOffsets is true, then we will later check our decoding table to see + * if it is even possible to generate long offsets. + */ + ZSTD_longOffset_e isLongOffset = (ZSTD_longOffset_e)(MEM_32bits() && (totalHistorySize > ZSTD_maxShortOffset())); /* These macros control at build-time which decompressor implementation * we use. If neither is defined, we do some inspection and dispatch at * runtime. @@ -2057,6 +2107,11 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, #if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) int usePrefetchDecoder = dctx->ddictIsCold; +#else + /* Set to 1 to avoid computing offset info if we don't need to. + * Otherwise this value is ignored. + */ + int usePrefetchDecoder = 1; #endif int nbSeq; size_t const seqHSize = ZSTD_decodeSeqHeaders(dctx, &nbSeq, ip, srcSize); @@ -2066,26 +2121,38 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, RETURN_ERROR_IF(dst == NULL && nbSeq > 0, dstSize_tooSmall, "NULL not handled"); -#if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ - !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) - if ( !usePrefetchDecoder - && (!frame || (dctx->fParams.windowSize > (1<<24))) - && (nbSeq>ADVANCED_SEQS) ) { /* could probably use a larger nbSeq limit */ - U32 const shareLongOffsets = ZSTD_getLongOffsetsShare(dctx->OFTptr); - U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */ - usePrefetchDecoder = (shareLongOffsets >= minShare); + /* If we could potentially have long offsets, or we might want to use the prefetch decoder, + * compute information about the share of long offsets, and the maximum nbAdditionalBits. + * NOTE: could probably use a larger nbSeq limit + */ + if (isLongOffset || (!usePrefetchDecoder && (totalHistorySize > (1u << 24)) && (nbSeq > 8))) { + ZSTD_OffsetInfo const info = ZSTD_getOffsetInfo(dctx->OFTptr); + if (isLongOffset && info.maxNbAdditionalBits <= STREAM_ACCUMULATOR_MIN) { + /* If isLongOffset, but the maximum number of additional bits that we see in our table is small + * enough, then we know it is impossible to have too long an offset in this block, so we can + * use the regular offset decoder. + */ + isLongOffset = ZSTD_lo_isRegularOffset; + } + if (!usePrefetchDecoder) { + U32 const minShare = MEM_64bits() ? 7 : 20; /* heuristic values, correspond to 2.73% and 7.81% */ + usePrefetchDecoder = (info.longOffsetShare >= minShare); + } } -#endif dctx->ddictIsCold = 0; #if !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT) && \ !defined(ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG) - if (usePrefetchDecoder) + if (usePrefetchDecoder) { +#else + (void)usePrefetchDecoder; + { #endif #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT return ZSTD_decompressSequencesLong(dctx, dst, dstCapacity, ip, srcSize, nbSeq, isLongOffset, frame); #endif + } #ifndef ZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG /* else */ From 3fe5f1fbb9fde42d50cbe35f89775d284663da99 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Wed, 1 Feb 2023 18:24:46 -0800 Subject: [PATCH 451/472] assert externalRepSearch != ZSTD_ps_auto --- lib/compress/zstd_compress.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 3ad6f05a2..5b89ca6d2 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -6335,6 +6335,7 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, } /* If we skipped repcode search while parsing, we need to update repcodes now */ + assert(externalRepSearch != ZSTD_ps_auto); assert(idx >= startIdx); if (externalRepSearch == ZSTD_ps_disable && idx != startIdx) { U32* const rep = updatedRepcodes.rep; From 71a0259247829546cd639e379a8c47384ed96a26 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Thu, 2 Feb 2023 10:53:08 -0800 Subject: [PATCH 452/472] Fix ZSTD_getOffsetInfo() when nbSeq == 0 In 32-bit mode, ZSTD_getOffsetInfo() can be called when nbSeq == 0, and in this case the offset table is uninitialized. The function should just return 0 for both values, because there are no sequences. Credit to OSS-Fuzz --- lib/decompress/zstd_decompress_block.c | 35 +++++++++++++++----------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/decompress/zstd_decompress_block.c b/lib/decompress/zstd_decompress_block.c index f8a7963a9..0a06a021e 100644 --- a/lib/decompress/zstd_decompress_block.c +++ b/lib/decompress/zstd_decompress_block.c @@ -2008,25 +2008,30 @@ typedef struct { * as well as the maximum number additional bits required. */ static ZSTD_OffsetInfo -ZSTD_getOffsetInfo(const ZSTD_seqSymbol* offTable) +ZSTD_getOffsetInfo(const ZSTD_seqSymbol* offTable, int nbSeq) { - const void* ptr = offTable; - U32 const tableLog = ((const ZSTD_seqSymbol_header*)ptr)[0].tableLog; - const ZSTD_seqSymbol* table = offTable + 1; - U32 const max = 1 << tableLog; - U32 u; ZSTD_OffsetInfo info = {0, 0}; - DEBUGLOG(5, "ZSTD_getLongOffsetsShare: (tableLog=%u)", tableLog); + /* If nbSeq == 0, then the offTable is uninitialized, but we have + * no sequences, so both values should be 0. + */ + if (nbSeq != 0) { + const void* ptr = offTable; + U32 const tableLog = ((const ZSTD_seqSymbol_header*)ptr)[0].tableLog; + const ZSTD_seqSymbol* table = offTable + 1; + U32 const max = 1 << tableLog; + U32 u; + DEBUGLOG(5, "ZSTD_getLongOffsetsShare: (tableLog=%u)", tableLog); - assert(max <= (1 << OffFSELog)); /* max not too large */ - for (u=0; u 22) info.longOffsetShare += 1; + assert(max <= (1 << OffFSELog)); /* max not too large */ + for (u=0; u 22) info.longOffsetShare += 1; + } + + assert(tableLog <= OffFSELog); + info.longOffsetShare <<= (OffFSELog - tableLog); /* scale to OffFSELog */ } - assert(tableLog <= OffFSELog); - info.longOffsetShare <<= (OffFSELog - tableLog); /* scale to OffFSELog */ - return info; } @@ -2126,7 +2131,7 @@ ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, * NOTE: could probably use a larger nbSeq limit */ if (isLongOffset || (!usePrefetchDecoder && (totalHistorySize > (1u << 24)) && (nbSeq > 8))) { - ZSTD_OffsetInfo const info = ZSTD_getOffsetInfo(dctx->OFTptr); + ZSTD_OffsetInfo const info = ZSTD_getOffsetInfo(dctx->OFTptr, nbSeq); if (isLongOffset && info.maxNbAdditionalBits <= STREAM_ACCUMULATOR_MIN) { /* If isLongOffset, but the maximum number of additional bits that we see in our table is small * enough, then we know it is impossible to have too long an offset in this block, so we can From 79bdb8cbb6232370336c2da0d1cc7610b67bb35d Mon Sep 17 00:00:00 2001 From: Yonatan Komornik <11005061+yoniko@users.noreply.github.com> Date: Thu, 2 Feb 2023 15:19:22 -0800 Subject: [PATCH 453/472] AsyncIO performance regression for small files fix (#3474) - Do not use threaded AsyncIO when handling small files. - Some typo / doc fixes --- programs/fileio.c | 25 ++++++++++ programs/fileio_asyncio.c | 97 ++++++++++++++++++++++++++++----------- programs/fileio_asyncio.h | 22 +++++++++ 3 files changed, 116 insertions(+), 28 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index fb71804d6..9a8300cdd 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -1758,6 +1758,7 @@ FIO_compressFilename_srcFile(FIO_ctx_t* const fCtx, int result; FILE* srcFile; stat_t srcFileStat; + U64 fileSize = UTIL_FILESIZE_UNKNOWN; DISPLAYLEVEL(6, "FIO_compressFilename_srcFile: %s \n", srcFileName); if (strcmp(srcFileName, stdinmark)) { @@ -1790,6 +1791,17 @@ FIO_compressFilename_srcFile(FIO_ctx_t* const fCtx, srcFile = FIO_openSrcFile(prefs, srcFileName, &srcFileStat); if (srcFile == NULL) return 1; /* srcFile could not be opened */ + /* Don't use AsyncIO for small files */ + if (strcmp(srcFileName, stdinmark)) /* Stdin doesn't have stats */ + fileSize = UTIL_getFileSizeStat(&srcFileStat); + if(fileSize != UTIL_FILESIZE_UNKNOWN && fileSize < ZSTD_BLOCKSIZE_MAX * 3) { + AIO_ReadPool_setAsync(ress.readCtx, 0); + AIO_WritePool_setAsync(ress.writeCtx, 0); + } else { + AIO_ReadPool_setAsync(ress.readCtx, 1); + AIO_WritePool_setAsync(ress.writeCtx, 1); + } + AIO_ReadPool_setFile(ress.readCtx, srcFile); result = FIO_compressFilename_dstFile( fCtx, prefs, ress, @@ -2586,6 +2598,7 @@ static int FIO_decompressSrcFile(FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs FILE* srcFile; stat_t srcFileStat; int result; + U64 fileSize = UTIL_FILESIZE_UNKNOWN; if (UTIL_isDirectory(srcFileName)) { DISPLAYLEVEL(1, "zstd: %s is a directory -- ignored \n", srcFileName); @@ -2594,6 +2607,18 @@ static int FIO_decompressSrcFile(FIO_ctx_t* const fCtx, FIO_prefs_t* const prefs srcFile = FIO_openSrcFile(prefs, srcFileName, &srcFileStat); if (srcFile==NULL) return 1; + + /* Don't use AsyncIO for small files */ + if (strcmp(srcFileName, stdinmark)) /* Stdin doesn't have stats */ + fileSize = UTIL_getFileSizeStat(&srcFileStat); + if(fileSize != UTIL_FILESIZE_UNKNOWN && fileSize < ZSTD_BLOCKSIZE_MAX * 3) { + AIO_ReadPool_setAsync(ress.readCtx, 0); + AIO_WritePool_setAsync(ress.writeCtx, 0); + } else { + AIO_ReadPool_setAsync(ress.readCtx, 1); + AIO_WritePool_setAsync(ress.writeCtx, 1); + } + AIO_ReadPool_setFile(ress.readCtx, srcFile); result = FIO_decompressDstFile(fCtx, prefs, ress, dstFileName, srcFileName, &srcFileStat); diff --git a/programs/fileio_asyncio.c b/programs/fileio_asyncio.c index 8f12fe1f9..fe9cca95d 100644 --- a/programs/fileio_asyncio.c +++ b/programs/fileio_asyncio.c @@ -140,7 +140,7 @@ int AIO_supported(void) { } /* *********************************** - * General IoPool implementation + * Generic IoPool implementation *************************************/ static IOJob_t *AIO_IOPool_createIoJob(IOPoolCtx_t *ctx, size_t bufferSize) { @@ -163,20 +163,22 @@ static IOJob_t *AIO_IOPool_createIoJob(IOPoolCtx_t *ctx, size_t bufferSize) { * Displays warning if asyncio is requested but MT isn't available. */ static void AIO_IOPool_createThreadPool(IOPoolCtx_t* ctx, const FIO_prefs_t* prefs) { ctx->threadPool = NULL; + ctx->threadPoolActive = 0; if(prefs->asyncIO) { if (ZSTD_pthread_mutex_init(&ctx->ioJobsMutex, NULL)) - EXM_THROW(102,"Failed creating write availableJobs mutex"); + EXM_THROW(102,"Failed creating ioJobsMutex mutex"); /* We want MAX_IO_JOBS-2 queue items because we need to always have 1 free buffer to * decompress into and 1 buffer that's actively written to disk and owned by the writing thread. */ assert(MAX_IO_JOBS >= 2); ctx->threadPool = POOL_create(1, MAX_IO_JOBS - 2); + ctx->threadPoolActive = 1; if (!ctx->threadPool) - EXM_THROW(104, "Failed creating writer thread pool"); + EXM_THROW(104, "Failed creating I/O thread pool"); } } /* AIO_IOPool_init: - * Allocates and sets and a new write pool including its included availableJobs. */ + * Allocates and sets and a new I/O thread pool including its included availableJobs. */ static void AIO_IOPool_init(IOPoolCtx_t* ctx, const FIO_prefs_t* prefs, POOL_function poolFunction, size_t bufferSize) { int i; AIO_IOPool_createThreadPool(ctx, prefs); @@ -192,27 +194,59 @@ static void AIO_IOPool_init(IOPoolCtx_t* ctx, const FIO_prefs_t* prefs, POOL_fun } +/* AIO_IOPool_threadPoolActive: + * Check if current operation uses thread pool. + * Note that in some cases we have a thread pool initialized but choose not to use it. */ +static int AIO_IOPool_threadPoolActive(IOPoolCtx_t* ctx) { + return ctx->threadPool && ctx->threadPoolActive; +} + + +/* AIO_IOPool_lockJobsMutex: + * Locks the IO jobs mutex if threading is active */ +static void AIO_IOPool_lockJobsMutex(IOPoolCtx_t* ctx) { + if(AIO_IOPool_threadPoolActive(ctx)) + ZSTD_pthread_mutex_lock(&ctx->ioJobsMutex); +} + +/* AIO_IOPool_unlockJobsMutex: + * Unlocks the IO jobs mutex if threading is active */ +static void AIO_IOPool_unlockJobsMutex(IOPoolCtx_t* ctx) { + if(AIO_IOPool_threadPoolActive(ctx)) + ZSTD_pthread_mutex_unlock(&ctx->ioJobsMutex); +} + /* AIO_IOPool_releaseIoJob: * Releases an acquired job back to the pool. Doesn't execute the job. */ static void AIO_IOPool_releaseIoJob(IOJob_t* job) { IOPoolCtx_t* const ctx = (IOPoolCtx_t *) job->ctx; - if(ctx->threadPool) - ZSTD_pthread_mutex_lock(&ctx->ioJobsMutex); + AIO_IOPool_lockJobsMutex(ctx); assert(ctx->availableJobsCount < ctx->totalIoJobs); ctx->availableJobs[ctx->availableJobsCount++] = job; - if(ctx->threadPool) - ZSTD_pthread_mutex_unlock(&ctx->ioJobsMutex); + AIO_IOPool_unlockJobsMutex(ctx); } /* AIO_IOPool_join: * Waits for all tasks in the pool to finish executing. */ static void AIO_IOPool_join(IOPoolCtx_t* ctx) { - if(ctx->threadPool) + if(AIO_IOPool_threadPoolActive(ctx)) POOL_joinJobs(ctx->threadPool); } +/* AIO_IOPool_setThreaded: + * Allows (de)activating threaded mode, to be used when the expected overhead + * of threading costs more than the expected gains. */ +static void AIO_IOPool_setThreaded(IOPoolCtx_t* ctx, int threaded) { + assert(threaded == 0 || threaded == 1); + assert(ctx != NULL); + if(ctx->threadPoolActive != threaded) { + AIO_IOPool_join(ctx); + ctx->threadPoolActive = threaded; + } +} + /* AIO_IOPool_free: - * Release a previously allocated write thread pool. Makes sure all takss are done and released. */ + * Release a previously allocated IO thread pool. Makes sure all tasks are done and released. */ static void AIO_IOPool_destroy(IOPoolCtx_t* ctx) { int i; if(ctx->threadPool) { @@ -236,12 +270,10 @@ static void AIO_IOPool_destroy(IOPoolCtx_t* ctx) { static IOJob_t* AIO_IOPool_acquireJob(IOPoolCtx_t* ctx) { IOJob_t *job; assert(ctx->file != NULL || ctx->prefs->testMode); - if(ctx->threadPool) - ZSTD_pthread_mutex_lock(&ctx->ioJobsMutex); + AIO_IOPool_lockJobsMutex(ctx); assert(ctx->availableJobsCount > 0); job = (IOJob_t*) ctx->availableJobs[--ctx->availableJobsCount]; - if(ctx->threadPool) - ZSTD_pthread_mutex_unlock(&ctx->ioJobsMutex); + AIO_IOPool_unlockJobsMutex(ctx); job->usedBufferSize = 0; job->file = ctx->file; job->offset = 0; @@ -251,8 +283,7 @@ static IOJob_t* AIO_IOPool_acquireJob(IOPoolCtx_t* ctx) { /* AIO_IOPool_setFile: * Sets the destination file for future files in the pool. - * Requires completion of all queues write jobs and release of all otherwise acquired jobs. - * Also requires ending of sparse write if a previous file was used in sparse mode. */ + * Requires completion of all queued jobs and release of all otherwise acquired jobs. */ static void AIO_IOPool_setFile(IOPoolCtx_t* ctx, FILE* file) { assert(ctx!=NULL); AIO_IOPool_join(ctx); @@ -269,7 +300,7 @@ static FILE* AIO_IOPool_getFile(const IOPoolCtx_t* ctx) { * The queued job shouldn't be used directly after queueing it. */ static void AIO_IOPool_enqueueJob(IOJob_t* job) { IOPoolCtx_t* const ctx = (IOPoolCtx_t *)job->ctx; - if(ctx->threadPool) + if(AIO_IOPool_threadPoolActive(ctx)) POOL_add(ctx->threadPool, ctx->poolFunction, job); else ctx->poolFunction(job); @@ -300,8 +331,7 @@ void AIO_WritePool_enqueueAndReacquireWriteJob(IOJob_t **job) { * Blocks on completion of all current write jobs before executing. */ void AIO_WritePool_sparseWriteEnd(WritePoolCtx_t* ctx) { assert(ctx != NULL); - if(ctx->base.threadPool) - POOL_joinJobs(ctx->base.threadPool); + AIO_IOPool_join(&ctx->base); AIO_fwriteSparseEnd(ctx->base.prefs, ctx->base.file, ctx->storedSkips); ctx->storedSkips = 0; } @@ -368,6 +398,13 @@ void AIO_WritePool_free(WritePoolCtx_t* ctx) { free(ctx); } +/* AIO_WritePool_setAsync: + * Allows (de)activating async mode, to be used when the expected overhead + * of asyncio costs more than the expected gains. */ +void AIO_WritePool_setAsync(WritePoolCtx_t* ctx, int async) { + AIO_IOPool_setThreaded(&ctx->base, async); +} + /* *********************************** * ReadPool implementation @@ -383,14 +420,13 @@ static void AIO_ReadPool_releaseAllCompletedJobs(ReadPoolCtx_t* ctx) { static void AIO_ReadPool_addJobToCompleted(IOJob_t* job) { ReadPoolCtx_t* const ctx = (ReadPoolCtx_t *)job->ctx; - if(ctx->base.threadPool) - ZSTD_pthread_mutex_lock(&ctx->base.ioJobsMutex); + AIO_IOPool_lockJobsMutex(&ctx->base); assert(ctx->completedJobsCount < MAX_IO_JOBS); ctx->completedJobs[ctx->completedJobsCount++] = job; - if(ctx->base.threadPool) { + if(AIO_IOPool_threadPoolActive(&ctx->base)) { ZSTD_pthread_cond_signal(&ctx->jobCompletedCond); - ZSTD_pthread_mutex_unlock(&ctx->base.ioJobsMutex); } + AIO_IOPool_unlockJobsMutex(&ctx->base); } /* AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked: @@ -426,8 +462,7 @@ static size_t AIO_ReadPool_numReadsInFlight(ReadPoolCtx_t* ctx) { * Would block. */ static IOJob_t* AIO_ReadPool_getNextCompletedJob(ReadPoolCtx_t* ctx) { IOJob_t *job = NULL; - if (ctx->base.threadPool) - ZSTD_pthread_mutex_lock(&ctx->base.ioJobsMutex); + AIO_IOPool_lockJobsMutex(&ctx->base); job = AIO_ReadPool_findNextWaitingOffsetCompletedJob_locked(ctx); @@ -443,8 +478,7 @@ static IOJob_t* AIO_ReadPool_getNextCompletedJob(ReadPoolCtx_t* ctx) { ctx->waitingOnOffset += job->usedBufferSize; } - if (ctx->base.threadPool) - ZSTD_pthread_mutex_unlock(&ctx->base.ioJobsMutex); + AIO_IOPool_unlockJobsMutex(&ctx->base); return job; } @@ -524,7 +558,7 @@ ReadPoolCtx_t* AIO_ReadPool_create(const FIO_prefs_t* prefs, size_t bufferSize) if(ctx->base.threadPool) if (ZSTD_pthread_cond_init(&ctx->jobCompletedCond, NULL)) - EXM_THROW(103,"Failed creating write jobCompletedCond mutex"); + EXM_THROW(103,"Failed creating jobCompletedCond cond"); return ctx; } @@ -620,3 +654,10 @@ int AIO_ReadPool_closeFile(ReadPoolCtx_t* ctx) { AIO_ReadPool_setFile(ctx, NULL); return fclose(file); } + +/* AIO_ReadPool_setAsync: + * Allows (de)activating async mode, to be used when the expected overhead + * of asyncio costs more than the expected gains. */ +void AIO_ReadPool_setAsync(ReadPoolCtx_t* ctx, int async) { + AIO_IOPool_setThreaded(&ctx->base, async); +} diff --git a/programs/fileio_asyncio.h b/programs/fileio_asyncio.h index 34dad6f4d..feb25a3f9 100644 --- a/programs/fileio_asyncio.h +++ b/programs/fileio_asyncio.h @@ -8,6 +8,17 @@ * You may select, at your option, one of the above-listed licenses. */ + /* + * FileIO AsyncIO exposes read/write IO pools that allow doing IO asynchronously. + * Current implementation relies on having one thread that reads and one that + * writes. + * Each IO pool supports up to `MAX_IO_JOBS` that can be enqueued for work, but + * are performed serially by the appropriate worker thread. + * Most systems exposes better primitives to perform asynchronous IO, such as + * io_uring on newer linux systems. The API is built in such a way that in the + * future we could replace the threads with better solutions when available. + */ + #ifndef ZSTD_FILEIO_ASYNCIO_H #define ZSTD_FILEIO_ASYNCIO_H @@ -27,6 +38,7 @@ extern "C" { typedef struct { /* These struct fields should be set only on creation and not changed afterwards */ POOL_ctx* threadPool; + int threadPoolActive; int totalIoJobs; const FIO_prefs_t* prefs; POOL_function poolFunction; @@ -136,6 +148,11 @@ WritePoolCtx_t* AIO_WritePool_create(const FIO_prefs_t* prefs, size_t bufferSize * Frees and releases a writePool and its resources. Closes destination file. */ void AIO_WritePool_free(WritePoolCtx_t* ctx); +/* AIO_WritePool_setAsync: + * Allows (de)activating async mode, to be used when the expected overhead + * of asyncio costs more than the expected gains. */ +void AIO_WritePool_setAsync(WritePoolCtx_t* ctx, int async); + /* AIO_ReadPool_create: * Allocates and sets and a new readPool including its included jobs. * bufferSize should be set to the maximal buffer we want to read at a time, will also be used @@ -146,6 +163,11 @@ ReadPoolCtx_t* AIO_ReadPool_create(const FIO_prefs_t* prefs, size_t bufferSize); * Frees and releases a readPool and its resources. Closes source file. */ void AIO_ReadPool_free(ReadPoolCtx_t* ctx); +/* AIO_ReadPool_setAsync: + * Allows (de)activating async mode, to be used when the expected overhead + * of asyncio costs more than the expected gains. */ +void AIO_ReadPool_setAsync(ReadPoolCtx_t* ctx, int async); + /* AIO_ReadPool_consumeBytes: * Consumes byes from srcBuffer's beginning and updates srcBufferLoaded accordingly. */ void AIO_ReadPool_consumeBytes(ReadPoolCtx_t *ctx, size_t n); From 35835f4126270a413ac2a28fb4981cc842ce62c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 05:12:10 +0000 Subject: [PATCH 454/472] Bump ilammy/msvc-dev-cmd from 1.12.0 to 1.12.1 Bumps [ilammy/msvc-dev-cmd](https://github.com/ilammy/msvc-dev-cmd) from 1.12.0 to 1.12.1. - [Release notes](https://github.com/ilammy/msvc-dev-cmd/releases) - [Commits](https://github.com/ilammy/msvc-dev-cmd/compare/7315a94840631165970262a99c72cfb48a65d25d...cec98b9d092141f74527d0afa6feb2af698cfe89) --- updated-dependencies: - dependency-name: ilammy/msvc-dev-cmd dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/dev-short-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index 2b2eb11b2..132dbb996 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -218,7 +218,7 @@ jobs: - name: Install packages run: pip install --pre meson - name: Initialize the MSVC dev command prompt - uses: ilammy/msvc-dev-cmd@7315a94840631165970262a99c72cfb48a65d25d + uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 - name: Configure with Meson run: | meson setup build/meson/ builddir -Dbin_tests=true -Dbin_programs=true -Dbin_contrib=true From 9cabd155fdf14b9ba8d240b42b2403e1da178a92 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 7 Feb 2023 00:35:51 -0800 Subject: [PATCH 455/472] return error code when benchmark fails such scenario can happen, for example, when trying a decompression-only benchmark on invalid data. Other possibilities include an allocation error in an intermediate step. So far, the benchmark would return immediately, but still return 0. On command line, this would be confusing, as the program appears successful (though it does not display any successful message). Now it returns !0, which can be interpreted as an error by command line. --- programs/zstdcli.c | 13 ++++++++----- tests/playTests.sh | 2 ++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/programs/zstdcli.c b/programs/zstdcli.c index 660e66bb6..93f75e21d 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -1370,7 +1370,7 @@ int main(int argCount, const char* argv[]) benchParams.ldmFlag = ldmFlag; benchParams.ldmMinMatch = (int)g_ldmMinMatch; benchParams.ldmHashLog = (int)g_ldmHashLog; - benchParams.useRowMatchFinder = useRowMatchFinder; + benchParams.useRowMatchFinder = (int)useRowMatchFinder; if (g_ldmBucketSizeLog != LDM_PARAM_DEFAULT) { benchParams.ldmBucketSizeLog = (int)g_ldmBucketSizeLog; } @@ -1391,15 +1391,18 @@ int main(int argCount, const char* argv[]) int c; DISPLAYLEVEL(3, "Benchmarking %s \n", filenames->fileNames[i]); for(c = cLevel; c <= cLevelLast; c++) { - BMK_benchFilesAdvanced(&filenames->fileNames[i], 1, dictFileName, c, &compressionParams, g_displayLevel, &benchParams); + BMK_benchOutcome_t const bo = BMK_benchFilesAdvanced(&filenames->fileNames[i], 1, dictFileName, c, &compressionParams, g_displayLevel, &benchParams); + if (!BMK_isSuccessful_benchOutcome(bo)) return 1; } } } else { for(; cLevel <= cLevelLast; cLevel++) { - BMK_benchFilesAdvanced(filenames->fileNames, (unsigned)filenames->tableSize, dictFileName, cLevel, &compressionParams, g_displayLevel, &benchParams); + BMK_benchOutcome_t const bo = BMK_benchFilesAdvanced(filenames->fileNames, (unsigned)filenames->tableSize, dictFileName, cLevel, &compressionParams, g_displayLevel, &benchParams); + if (!BMK_isSuccessful_benchOutcome(bo)) return 1; } } } else { for(; cLevel <= cLevelLast; cLevel++) { - BMK_syntheticTest(cLevel, compressibility, &compressionParams, g_displayLevel, &benchParams); + BMK_benchOutcome_t const bo = BMK_syntheticTest(cLevel, compressibility, &compressionParams, g_displayLevel, &benchParams); + if (!BMK_isSuccessful_benchOutcome(bo)) return 1; } } #else @@ -1545,7 +1548,7 @@ int main(int argCount, const char* argv[]) if (g_ldmBucketSizeLog != LDM_PARAM_DEFAULT) FIO_setLdmBucketSizeLog(prefs, (int)g_ldmBucketSizeLog); if (g_ldmHashRateLog != LDM_PARAM_DEFAULT) FIO_setLdmHashRateLog(prefs, (int)g_ldmHashRateLog); FIO_setAdaptiveMode(prefs, adapt); - FIO_setUseRowMatchFinder(prefs, useRowMatchFinder); + FIO_setUseRowMatchFinder(prefs, (int)useRowMatchFinder); FIO_setAdaptMin(prefs, adaptMin); FIO_setAdaptMax(prefs, adaptMax); FIO_setRsyncable(prefs, rsyncable); diff --git a/tests/playTests.sh b/tests/playTests.sh index 5d78e9e7d..5f595f611 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -1217,6 +1217,8 @@ zstd -rqi0b1e2 tmp1 println "benchmark decompression only" zstd -f tmp1 zstd -b -d -i0 tmp1.zst +println "benchmark can fail - decompression on invalid data" +zstd -b -d -i0 tmp1 && die "invalid .zst data => benchmark should have failed" GZIPMODE=1 zstd --format=gzip -V || GZIPMODE=0 From 58e7067c7d500537bfdccc5ee4707ac0154656d7 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 7 Feb 2023 08:47:39 -0800 Subject: [PATCH 456/472] added more accurate error messages for the decompression-only benchmark mode. --- programs/benchzstd.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/programs/benchzstd.c b/programs/benchzstd.c index 7770dd2a5..e9deeb6fa 100644 --- a/programs/benchzstd.c +++ b/programs/benchzstd.c @@ -327,26 +327,31 @@ BMK_benchMemAdvancedNoAlloc( /* init */ memset(&benchResult, 0, sizeof(benchResult)); if (strlen(displayName)>17) displayName += strlen(displayName) - 17; /* display last 17 characters */ - if (adv->mode == BMK_decodeOnly) { /* benchmark only decompression : source must be already compressed */ + if (adv->mode == BMK_decodeOnly) { + /* benchmark only decompression : source must be already compressed */ const char* srcPtr = (const char*)srcBuffer; U64 totalDSize64 = 0; U32 fileNb; for (fileNb=0; fileNb decodedSize) { /* size_t overflow */ + RETURN_ERROR(32, BMK_benchOutcome_t, "decompressed size is too large for local system"); + } *resultBufferPtr = malloc(decodedSize); if (!(*resultBufferPtr)) { - RETURN_ERROR(33, BMK_benchOutcome_t, "not enough memory"); - } - if (totalDSize64 > decodedSize) { /* size_t overflow */ - free(*resultBufferPtr); - RETURN_ERROR(32, BMK_benchOutcome_t, "original size is too large"); + RETURN_ERROR(33, BMK_benchOutcome_t, "allocation error: not enough memory"); } cSize = srcSize; srcSize = decodedSize; @@ -474,7 +479,7 @@ BMK_benchMemAdvancedNoAlloc( BMK_runOutcome_t const dOutcome = BMK_benchTimedFn(timeStateDecompress, dbp); if(!BMK_isSuccessful_runOutcome(dOutcome)) { - return BMK_benchOutcome_error(); + RETURN_ERROR(30, BMK_benchOutcome_t, "decompression error"); } { BMK_runTime_t const dResult = BMK_extract_runTime(dOutcome); @@ -598,7 +603,7 @@ BMK_benchOutcome_t BMK_benchMemAdvanced(const void* srcBuffer, size_t srcSize, void* resultBuffer = srcSize ? malloc(srcSize) : NULL; - int allocationincomplete = !srcPtrs || !srcSizes || !cPtrs || + int const allocationincomplete = !srcPtrs || !srcSizes || !cPtrs || !cSizes || !cCapacities || !resPtrs || !resSizes || !timeStateCompress || !timeStateDecompress || !cctx || !dctx || From 6740f8f0b8720ded3e8fa35f546115ac29c60e2e Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 7 Feb 2023 10:02:09 -0800 Subject: [PATCH 457/472] add error message for the (rare) compression error scenario --- programs/benchzstd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/benchzstd.c b/programs/benchzstd.c index e9deeb6fa..a76db5f37 100644 --- a/programs/benchzstd.c +++ b/programs/benchzstd.c @@ -451,7 +451,7 @@ BMK_benchMemAdvancedNoAlloc( BMK_runOutcome_t const cOutcome = BMK_benchTimedFn( timeStateCompress, cbp); if (!BMK_isSuccessful_runOutcome(cOutcome)) { - return BMK_benchOutcome_error(); + RETURN_ERROR(30, BMK_benchOutcome_t, "compression error"); } { BMK_runTime_t const cResult = BMK_extract_runTime(cOutcome); From e04706c58cc462cc771292c01abc66caaebe57a6 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 6 Feb 2023 20:20:01 -0800 Subject: [PATCH 458/472] fix oss-fuzz case 55714 impacts legacy decoder v0.3 in 32-bit mode --- lib/legacy/zstd_v03.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/legacy/zstd_v03.c b/lib/legacy/zstd_v03.c index 5b1fd7175..d247d5d55 100644 --- a/lib/legacy/zstd_v03.c +++ b/lib/legacy/zstd_v03.c @@ -2706,18 +2706,24 @@ static size_t ZSTD_execSequence(BYTE* op, const BYTE* const litEnd = *litPtr + sequence.litLength; /* checks */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use the pointer check */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = litEnd; /* update for next sequence */ /* copy Match */ - { - const BYTE* match = op - sequence.offset; + { const BYTE* match = op - sequence.offset; /* check */ if (sequence.offset > (size_t)op) return ERROR(corruption_detected); /* address space overflow test (this test seems kept by clang optimizer) */ From cfec005efd13b45433210ad8db543de3440fe2ad Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 6 Feb 2023 20:26:25 -0800 Subject: [PATCH 459/472] fix for v0.3 blindly ported to v0.2 in case it would be applicable here too. --- lib/legacy/zstd_v02.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/legacy/zstd_v02.c b/lib/legacy/zstd_v02.c index dfaed7bb8..e09bb4a24 100644 --- a/lib/legacy/zstd_v02.c +++ b/lib/legacy/zstd_v02.c @@ -3066,12 +3066,19 @@ static size_t ZSTD_execSequence(BYTE* op, const BYTE* const litEnd = *litPtr + sequence.litLength; /* checks */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use the pointer check */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = litEnd; /* update for next sequence */ From 7eb4471fec8807b67a8475ad13cdf0310f2fad81 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 6 Feb 2023 20:33:38 -0800 Subject: [PATCH 460/472] adapt v0.3 fix to v0.1 slightly different constraints on end of buffer conditions --- lib/legacy/zstd_v01.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/legacy/zstd_v01.c b/lib/legacy/zstd_v01.c index 8c504c792..7f24cf685 100644 --- a/lib/legacy/zstd_v01.c +++ b/lib/legacy/zstd_v01.c @@ -1720,20 +1720,25 @@ static size_t ZSTD_execSequence(BYTE* op, static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */ static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */ const BYTE* const ostart = op; + BYTE* const oLitEnd = op + sequence.litLength; const size_t litLength = sequence.litLength; BYTE* const endMatch = op + litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */ const BYTE* const litEnd = *litPtr + litLength; - /* check */ + /* checks */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ + if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); + if (endMatch > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ - if (litEnd > litLimit) return ERROR(corruption_detected); - if (sequence.matchLength > (size_t)(*litPtr-op)) return ERROR(dstSize_tooSmall); /* overwrite literal segment */ + if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - if (((size_t)(*litPtr - op) < 8) || ((size_t)(oend-litEnd) < 8) || (op+litLength > oend-8)) - memmove(op, *litPtr, litLength); /* overwrite risk */ - else - ZSTD_wildcopy(op, *litPtr, litLength); + ZSTD_memmove(op, *litPtr, sequence.litLength); /* note : v0.1 seems to allow scenarios where output or input are close to end of buffer */ + op += litLength; *litPtr = litEnd; /* update for next sequence */ From b20e4e95f2a9295adf82c4fdb13bcb1864983fd9 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 6 Feb 2023 20:36:37 -0800 Subject: [PATCH 461/472] copy fix for v0.3 to v0.4 in case it would be applicable for this legacy version too. --- lib/legacy/zstd_v03.c | 2 +- lib/legacy/zstd_v04.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/legacy/zstd_v03.c b/lib/legacy/zstd_v03.c index d247d5d55..b0d7f521e 100644 --- a/lib/legacy/zstd_v03.c +++ b/lib/legacy/zstd_v03.c @@ -2710,7 +2710,7 @@ static size_t ZSTD_execSequence(BYTE* op, if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); - /* Now we know there are no overflow in literal nor match lengths, can use the pointer check */ + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); diff --git a/lib/legacy/zstd_v04.c b/lib/legacy/zstd_v04.c index 23735443a..f820134b7 100644 --- a/lib/legacy/zstd_v04.c +++ b/lib/legacy/zstd_v04.c @@ -2828,13 +2828,20 @@ static size_t ZSTD_execSequence(BYTE* op, const BYTE* const litEnd = *litPtr + sequence.litLength; const BYTE* match = oLitEnd - sequence.offset; - /* check */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + /* checks */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ - if (litEnd > litLimit) return ERROR(corruption_detected); /* risk read beyond lit buffer */ + if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTD_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = litEnd; /* update for next sequence */ From 7a1a1716587c7e600e7c1759daccf5c679b6d961 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 6 Feb 2023 20:40:29 -0800 Subject: [PATCH 462/472] port fix for v0.3 to v0.5 in case it would be applicable for this version too --- lib/legacy/zstd_v05.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/legacy/zstd_v05.c b/lib/legacy/zstd_v05.c index 5d2ebb2b5..85c4ce79f 100644 --- a/lib/legacy/zstd_v05.c +++ b/lib/legacy/zstd_v05.c @@ -3182,13 +3182,20 @@ static size_t ZSTDv05_execSequence(BYTE* op, const BYTE* const litEnd = *litPtr + sequence.litLength; const BYTE* match = oLitEnd - sequence.offset; - /* check */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + /* checks */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ - if (litEnd > litLimit) return ERROR(corruption_detected); /* risk read beyond lit buffer */ + if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTDv05_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTDv05_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = litEnd; /* update for next sequence */ From 67d7a659f871a1bfbd99e82ad5036e619b7ca758 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 6 Feb 2023 20:43:09 -0800 Subject: [PATCH 463/472] port fix for v0.3 to v0.6 in case it would applicable for this version --- lib/legacy/zstd_v06.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/legacy/zstd_v06.c b/lib/legacy/zstd_v06.c index 53aaec468..097182a4c 100644 --- a/lib/legacy/zstd_v06.c +++ b/lib/legacy/zstd_v06.c @@ -3322,13 +3322,20 @@ static size_t ZSTDv06_execSequence(BYTE* op, const BYTE* const iLitEnd = *litPtr + sequence.litLength; const BYTE* match = oLitEnd - sequence.offset; - /* check */ - if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */ + /* checks */ + size_t const seqLength = sequence.litLength + sequence.matchLength; + + if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); + /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ + if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); + if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); + if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ - if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */ + if (iLitEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ /* copy Literals */ - ZSTDv06_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ + ZSTDv06_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = iLitEnd; /* update for next sequence */ From 94197471719757d9dcf7aca10705d829a45817c8 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 7 Feb 2023 14:02:12 -0800 Subject: [PATCH 464/472] fix legacy decoders v0.4, v0.5 and v0.6 --- lib/legacy/zstd_v04.c | 1 - lib/legacy/zstd_v05.c | 1 - lib/legacy/zstd_v06.c | 1 - 3 files changed, 3 deletions(-) diff --git a/lib/legacy/zstd_v04.c b/lib/legacy/zstd_v04.c index f820134b7..57be832bd 100644 --- a/lib/legacy/zstd_v04.c +++ b/lib/legacy/zstd_v04.c @@ -2835,7 +2835,6 @@ static size_t ZSTD_execSequence(BYTE* op, if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); - if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ diff --git a/lib/legacy/zstd_v05.c b/lib/legacy/zstd_v05.c index 85c4ce79f..93a1169f3 100644 --- a/lib/legacy/zstd_v05.c +++ b/lib/legacy/zstd_v05.c @@ -3189,7 +3189,6 @@ static size_t ZSTDv05_execSequence(BYTE* op, if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); - if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ diff --git a/lib/legacy/zstd_v06.c b/lib/legacy/zstd_v06.c index 097182a4c..175f7cc42 100644 --- a/lib/legacy/zstd_v06.c +++ b/lib/legacy/zstd_v06.c @@ -3329,7 +3329,6 @@ static size_t ZSTDv06_execSequence(BYTE* op, if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected); /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */ if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); - if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected); if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ if (iLitEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ From c5bf6b8b88456804b480176c6183a893ca01bf15 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 7 Feb 2023 14:47:16 -0800 Subject: [PATCH 465/472] add requested check for legacy decoder v0.1 which uses a different technique to store literals, and therefore must check for potential overwrites. --- lib/legacy/zstd_v01.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/legacy/zstd_v01.c b/lib/legacy/zstd_v01.c index 7f24cf685..1a3aad07e 100644 --- a/lib/legacy/zstd_v01.c +++ b/lib/legacy/zstd_v01.c @@ -1735,6 +1735,7 @@ static size_t ZSTD_execSequence(BYTE* op, if (endMatch > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */ if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */ + if (sequence.matchLength > (size_t)(*litPtr-op)) return ERROR(dstSize_tooSmall); /* overwrite literal segment */ /* copy Literals */ ZSTD_memmove(op, *litPtr, sequence.litLength); /* note : v0.1 seems to allow scenarios where output or input are close to end of buffer */ From c689310b2544c1eee6002bb4fa9a7ed8c7609dd1 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 7 Feb 2023 17:11:07 -0800 Subject: [PATCH 466/472] rewrite legacy v0.7 bound checks to be independent of address space overflow --- lib/legacy/zstd_v07.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/legacy/zstd_v07.c b/lib/legacy/zstd_v07.c index c2b88eb3e..15dc3ef79 100644 --- a/lib/legacy/zstd_v07.c +++ b/lib/legacy/zstd_v07.c @@ -3552,11 +3552,14 @@ size_t ZSTDv07_execSequence(BYTE* op, const BYTE* match = oLitEnd - sequence.offset; /* check */ - if ((oLitEnd>oend_w) | (oMatchEnd>oend)) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */ - if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */ + assert(oend >= op); + if (sequence.litLength + WILDCOPY_OVERLENGTH > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + if (sequenceLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall); + assert(litLimit >= *litPtr); + if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected);; /* copy Literals */ - ZSTDv07_wildcopy(op, *litPtr, sequence.litLength); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ + ZSTDv07_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */ op = oLitEnd; *litPtr = iLitEnd; /* update for next sequence */ @@ -3570,7 +3573,7 @@ size_t ZSTDv07_execSequence(BYTE* op, return sequenceLength; } /* span extDict & currentPrefixSegment */ - { size_t const length1 = dictEnd - match; + { size_t const length1 = (size_t)(dictEnd - match); memmove(oLitEnd, match, length1); op = oLitEnd + length1; sequence.matchLength -= length1; From 83f8a05f87cc5ee94aca47d250980bde22bb7bf1 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Wed, 8 Feb 2023 11:42:46 -0800 Subject: [PATCH 467/472] Fix empty-block.zst golden decompression file This frame is invalid because the `Window_Size = 0`, and the `Block_Maximum_Size = min(128 KB, Window_Size) = 0`. But the empty compressed block has a `Block_Content` size of 2, which is invalid. The fix is to switch to using a `Window_Descriptor` instead of the `Single_Segment_Flag`. This sets the `Window_Size = 1024`. Hexdump before this PR: `28b5 2ffd 2000 1500 0000 00` Hexdump after this PR: `28b5 2ffd 0000 1500 0000 00` For issue #3482. --- tests/golden-decompression/empty-block.zst | Bin 11 -> 11 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/golden-decompression/empty-block.zst b/tests/golden-decompression/empty-block.zst index 2a3782aff0d1a6bab62dcdc1af29b448322a84bd..fbfb893e11eb677f1e6444ead8a5829a3a23e53e 100644 GIT binary patch literal 11 ScmdPcs{faPL6m`kfdK##%>o|) literal 11 ScmdPcs{dDkL6m`kfdK#$tpYy) From 4de9d637e86ea7963225d1a87d2d26f0e1e039fe Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 8 Feb 2023 15:56:49 -0800 Subject: [PATCH 468/472] minor: fix missing newline character in help page --- contrib/largeNbDicts/largeNbDicts.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/largeNbDicts/largeNbDicts.c b/contrib/largeNbDicts/largeNbDicts.c index 7b2af0bae..eeaaf7182 100644 --- a/contrib/largeNbDicts/largeNbDicts.c +++ b/contrib/largeNbDicts/largeNbDicts.c @@ -985,7 +985,7 @@ int usage(const char* exeName) DISPLAY ("-# : use compression level # (default: %u) \n", CLEVEL_DEFAULT); DISPLAY ("-D # : use # as a dictionary (default: create one) \n"); DISPLAY ("-i# : nb benchmark rounds (default: %u) \n", BENCH_TIME_DEFAULT_S); - DISPLAY ("-p# : print speed for all rounds 0=fastest 1=median (default: 0)"); + DISPLAY ("-p# : print speed for all rounds 0=fastest 1=median (default: 0) \n"); DISPLAY ("--nbBlocks=#: use # blocks for bench (default: one per file) \n"); DISPLAY ("--nbDicts=# : create # dictionaries for bench (default: one per block) \n"); DISPLAY ("-h : help (this text) \n"); From 4aa3bc49da8608c0cc921fbc49b703addb6cffa8 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 8 Feb 2023 16:35:55 -0800 Subject: [PATCH 469/472] updated CHANGELOG in preparation for v1.5.4 release --- CHANGELOG | 75 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 6ddec4107..11cc0d3fb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,39 +1,62 @@ -v1.5.4 - -v1.5.3 (June, 2022) (unpublished) -perf: 5-30% faster dictionary compression at levels 1-4 (#3086, #3114, #3152, @embg) -perf: 5-10% faster streaming compression at levels 1-2 (#3114, @embg) -perf: Remove branch in ZSTD_fast_noDict (#3129, @felixhandte) -perf: Add option to prefetch CDict tables (#3177, @embg) -perf: Minor compression ratio improvement (#2983, @Cyan4973) -perf: Minor speed improvement for Huffman decoding (#3013, @WojciechMula) -perf: Enable STATIC_BMI2 for gcc/clang (#3080, @TocarIP) -perf: Optimize ZSTD_row_getMatchMask for ARM levels 8-10 (#3139, #3160, @danlark1) -perf: aarch64 performance improvements (#3145, #3141, @JunHe77) -perf: Lazy parameters adaptation (#2974, @Cyan4973) -cli: Async write for decompression (#2975, @yoniko) -cli: Use buffered output (#2985, @yoniko) -cli: Change zstdless behavior to align with zless (#2909, @binhdvo) -cli: AsyncIO compression (#3021, #3022, @yoniko) -cli: Print zlib/lz4/lzma library versions in verbose version output (#3030, @terrelln) -cli: Fix for -r on empty directory (#3027, @brailovich) -cli: Fix required decompression memory usage reported by -vv + --long (#3042, @u1f35c) +v1.5.4 (Feb 2023) +perf: +20% faster huffman decompression for targets that can't compile x64 assembly (#3449, @terrelln) +perf: up to +10% faster streaming compression at levels 1-2 (#3114, @embg) +perf: +4-13% for levels 5-12 by optimizing function generation (#3295, @terrelln) +pref: +3-11% compression speed for `arm` target (#3199, #3164, #3145, #3141, #3138, @JunHe77 and #3139, #3160, @danlark1) +perf: +5-30% faster dictionary compression at levels 1-4 (#3086, #3114, #3152, @embg) +perf: +10-20% cold dict compression speed by prefetching CDict tables (#3177, @embg) +perf: +1% faster compression by removing a branch in ZSTD_fast_noDict (#3129, @felixhandte) +perf: Small compression ratio improvements in high compression mode (#2983, #3391, @Cyan4973 and #3285, #3302, @daniellerozenblit) +perf: small speed improvement by better detecting `STATIC_BMI2` for `clang` (#3080, @TocarIP) +perf: Improved streaming performance when `ZSTD_c_stableInBuffer` is set (#2974, @Cyan4973) +cli: Asynchronous I/O for improved cli speed (#2975, #2985, #3021, #3022, @yoniko) +cli: Change `zstdless` behavior to align with `zless` (#2909, @binhdvo) +cli: Keep original file if `-c` or `--stdout` is given (#3052, @dirkmueller) +cli: Keep original files when result is concatenated into a single output with `-o` (#3450, @Cyan4973) +cli: Preserve Permissions and Ownership of regular files (#3432, @felixhandte) +cli: Print zlib/lz4/lzma library versions with `-vv` (#3030, @terrelln) +cli: Print checksum value for single frame files with `-lv` (#3332, @Cyan4973) +cli: Print `dictID` when present with `-lv` (#3184, @htnhan) +cli: when `stderr` is *not* the console, disable status updates, but preserve final summary (#3458, @Cyan4973) +cli: support `--best` and `--no-name` in `gzip` compatibility mode (#3059, @dirkmueller) +cli: support for `posix` high resolution timer `clock_gettime()`, for improved benchmark accuracy (#3423, @Cyan4973) +cli: improved help/usage (`-h`, `-H`) formatting (#3094, @dirkmueller and #3385, @jonpalmisc) +cli: Fix better handling of bogus numeric values (#3268, @ctkhanhly) +cli: Fix input consists of multiple files _and_ `stdin` (#3222, @yoniko) +cli: Fix tiny files passthrough (#3215, @cgbur) +cli: Fix for `-r` on empty directory (#3027, @brailovich) +cli: Fix empty string as argument for `--output-dir-*` (#3220, @embg) +cli: Fix decompression memory usage reported by `-vv --long` (#3042, @u1f35c, and #3232, @zengyijing) cli: Fix infinite loop when empty input is passed to trainer (#3081, @terrelln) -cli: Implement more gzip compatibility (#3059, @dirkmueller) -cli: Keep original file if -c or --stdout is given (#3052, @dirkmueller) +cli: Fix `--adapt` doesn't work when `--no-progress` is also set (#3354, @terrelln) +api: Support for External matchfinder (#3333, @embg) +api: Support for in-place decompression (#3432, @terrelln) +api: New `ZSTD_CCtx_setCParams()` function, set all parameters defined in a `ZSTD_compressionParameters` structure (#3403, @Cyan4973) +api: Streaming decompression detects incorrect header ID sooner (#3175, @Cyan4973) +api: Window size resizing optimization for edge case (#3345, @daniellerozenblit) +api: More accurate error codes for busy-loop scenarios (#3413, #3455, @Cyan4973) +api: Fix limit overflow in `compressBound` and `decompressBound` (#3362, #3373, Cyan4973) reported by @nigeltao +api: Deprecate several advanced experimental functions: streaming (#3408, @embg), copy (#3196, @mileshu) +bug: Fix corruption that rarely occurs in 32-bit mode with wlog=25 (#3361, @terrelln) bug: Fix for block-splitter (#3033, @Cyan4973) bug: Fixes for Sequence Compression API (#3023, #3040, @Cyan4973) bug: Fix leaking thread handles on Windows (#3147, @animalize) bug: Fix timing issues with cmake/meson builds (#3166, #3167, #3170, @Cyan4973) build: Allow user to select legacy level for cmake (#3050, @shadchin) build: Enable legacy support by default in cmake (#3079, @niamster) -build: Meson improvements (#3039, #3122, @eli-schwartz) +build: Meson build script improvements (#3039, #3120, #3122, #3327, #3357, @eli-schwartz and #3276, @neheb) build: Add aarch64 to supported architectures for zstd_trace (#3054, @ooosssososos) -doc: Split help in long and short version, cleanup formatting (#3094, @dirkmueller) -doc: Updated man page, providing more details for --train mode (#3112, @Cyan4973) +build: support AIX architecture (#3219, @qiongsiwu) +build: Fix `ZSTD_LIB_MINIFY` build macro, which now reduces static library size by half (#3366, @terrelln) +build: Fix Windows issues with Multithreading translation layer (#3364, #3380, @yoniko) and ARM64 target (#3320, @cwoffenden) +build: Fix `cmake` script (#3382, #3392, @terrelln and #3252 @Tachi107 and #3167 @Cyan4973) +doc: Updated man page, providing more details for `--train` mode (#3112, @Cyan4973) doc: Add decompressor errata document (#3092, @terrelln) misc: Enable Intel CET (#2992, #2994, @hjl-tools) -misc: Streaming decompression can detect incorrect header ID sooner (#3175, @Cyan4973) +misc: Fix `contrib/` seekable format (#3058, @yhoogstrate and #3346, @daniellerozenblit) +misc: Improve speed of the one-file library generator (#3241, @wahern and #3005, @cwoffenden) + +v1.5.3 (dev version, unpublished) v1.5.2 (Jan, 2022) perf: Regain Minimal memset()-ing During Reuse of Compression Contexts (@Cyan4973, #2969) From ff42ed1582bf15fbeb1585df71e42676a7d49da7 Mon Sep 17 00:00:00 2001 From: Elliot Gorokhovsky Date: Thu, 9 Feb 2023 17:01:17 -0500 Subject: [PATCH 470/472] Rename "External Matchfinder" to "Block-Level Sequence Producer" (#3484) * change "external matchfinder" to "external sequence producer" * migrate contrib/ to new naming convention * fix contrib build * fix error message * update debug strings * fix def of invalid sequences in zstd.h * nit * update CHANGELOG * fix .gitignore --- CHANGELOG | 2 +- Makefile | 4 +- contrib/externalMatchfinder/.gitignore | 2 - contrib/externalMatchfinder/README.md | 14 -- contrib/externalSequenceProducer/.gitignore | 2 + .../Makefile | 8 +- contrib/externalSequenceProducer/README.md | 14 ++ .../main.c | 14 +- .../sequence_producer.c} | 8 +- .../sequence_producer.h} | 4 +- lib/common/error_private.c | 2 +- lib/compress/zstd_compress.c | 82 +++---- lib/compress/zstd_compress_internal.h | 6 +- lib/zstd.h | 201 +++++++++--------- lib/zstd_errors.h | 2 +- tests/external_matchfinder.c | 18 +- tests/external_matchfinder.h | 4 +- tests/fuzz/Makefile | 4 +- tests/fuzz/zstd_helpers.c | 14 +- tests/zstreamtest.c | 46 ++-- 20 files changed, 231 insertions(+), 220 deletions(-) delete mode 100644 contrib/externalMatchfinder/.gitignore delete mode 100644 contrib/externalMatchfinder/README.md create mode 100644 contrib/externalSequenceProducer/.gitignore rename contrib/{externalMatchfinder => externalSequenceProducer}/Makefile (87%) create mode 100644 contrib/externalSequenceProducer/README.md rename contrib/{externalMatchfinder => externalSequenceProducer}/main.c (89%) rename contrib/{externalMatchfinder/matchfinder.c => externalSequenceProducer/sequence_producer.c} (94%) rename contrib/{externalMatchfinder/matchfinder.h => externalSequenceProducer/sequence_producer.h} (91%) diff --git a/CHANGELOG b/CHANGELOG index 11cc0d3fb..4010c1ff5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -29,7 +29,7 @@ cli: Fix empty string as argument for `--output-dir-*` (#3220, @embg) cli: Fix decompression memory usage reported by `-vv --long` (#3042, @u1f35c, and #3232, @zengyijing) cli: Fix infinite loop when empty input is passed to trainer (#3081, @terrelln) cli: Fix `--adapt` doesn't work when `--no-progress` is also set (#3354, @terrelln) -api: Support for External matchfinder (#3333, @embg) +api: Support for Block-Level Sequence Producer (#3333, @embg) api: Support for in-place decompression (#3432, @terrelln) api: New `ZSTD_CCtx_setCParams()` function, set all parameters defined in a `ZSTD_compressionParameters` structure (#3403, @Cyan4973) api: Streaming decompression detects incorrect header ID sooner (#3175, @Cyan4973) diff --git a/Makefile b/Makefile index 75a47a308..a7890a5b1 100644 --- a/Makefile +++ b/Makefile @@ -123,7 +123,7 @@ contrib: lib $(MAKE) -C contrib/seekable_format/examples all $(MAKE) -C contrib/seekable_format/tests test $(MAKE) -C contrib/largeNbDicts all - $(MAKE) -C contrib/externalMatchfinder all + $(MAKE) -C contrib/externalSequenceProducer all cd build/single_file_libs/ ; ./build_decoder_test.sh cd build/single_file_libs/ ; ./build_library_test.sh @@ -143,7 +143,7 @@ clean: $(Q)$(MAKE) -C contrib/seekable_format/examples $@ > $(VOID) $(Q)$(MAKE) -C contrib/seekable_format/tests $@ > $(VOID) $(Q)$(MAKE) -C contrib/largeNbDicts $@ > $(VOID) - $(Q)$(MAKE) -C contrib/externalMatchfinder $@ > $(VOID) + $(Q)$(MAKE) -C contrib/externalSequenceProducer $@ > $(VOID) $(Q)$(RM) zstd$(EXT) zstdmt$(EXT) tmp* $(Q)$(RM) -r lz4 @echo Cleaning completed diff --git a/contrib/externalMatchfinder/.gitignore b/contrib/externalMatchfinder/.gitignore deleted file mode 100644 index 46357ef58..000000000 --- a/contrib/externalMatchfinder/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# build artifacts -externalMatchfinder diff --git a/contrib/externalMatchfinder/README.md b/contrib/externalMatchfinder/README.md deleted file mode 100644 index cb7d49d97..000000000 --- a/contrib/externalMatchfinder/README.md +++ /dev/null @@ -1,14 +0,0 @@ -externalMatchfinder -===================== - -`externalMatchfinder` is a test tool for the external matchfinder API. -It demonstrates how to use the API to perform a simple round-trip test. - -A sample matchfinder is provided in matchfinder.c, but the user can swap -this out with a different one if desired. The sample matchfinder implements -LZ compression with a 1KB hashtable. Dictionary compression is not currently supported. - -Command line : -``` -externalMatchfinder filename -``` diff --git a/contrib/externalSequenceProducer/.gitignore b/contrib/externalSequenceProducer/.gitignore new file mode 100644 index 000000000..147710aee --- /dev/null +++ b/contrib/externalSequenceProducer/.gitignore @@ -0,0 +1,2 @@ +# build artifacts +externalSequenceProducer diff --git a/contrib/externalMatchfinder/Makefile b/contrib/externalSequenceProducer/Makefile similarity index 87% rename from contrib/externalMatchfinder/Makefile rename to contrib/externalSequenceProducer/Makefile index 2baa558cb..0591ae01b 100644 --- a/contrib/externalMatchfinder/Makefile +++ b/contrib/externalSequenceProducer/Makefile @@ -23,11 +23,11 @@ DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \ -Wredundant-decls CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS) -default: externalMatchfinder +default: externalSequenceProducer -all: externalMatchfinder +all: externalSequenceProducer -externalMatchfinder: matchfinder.c main.c $(LIBZSTD) +externalSequenceProducer: sequence_producer.c main.c $(LIBZSTD) $(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@ .PHONY: $(LIBZSTD) @@ -37,4 +37,4 @@ $(LIBZSTD): clean: $(RM) *.o $(MAKE) -C $(LIBDIR) clean > /dev/null - $(RM) externalMatchfinder + $(RM) externalSequenceProducer diff --git a/contrib/externalSequenceProducer/README.md b/contrib/externalSequenceProducer/README.md new file mode 100644 index 000000000..c16a17007 --- /dev/null +++ b/contrib/externalSequenceProducer/README.md @@ -0,0 +1,14 @@ +externalSequenceProducer +===================== + +`externalSequenceProducer` is a test tool for the Block-Level Sequence Producer API. +It demonstrates how to use the API to perform a simple round-trip test. + +A sample sequence producer is provided in sequence_producer.c, but the user can swap +this out with a different one if desired. The sample sequence producer implements +LZ parsing with a 1KB hashtable. Dictionary-based parsing is not currently supported. + +Command line : +``` +externalSequenceProducer filename +``` diff --git a/contrib/externalMatchfinder/main.c b/contrib/externalSequenceProducer/main.c similarity index 89% rename from contrib/externalMatchfinder/main.c rename to contrib/externalSequenceProducer/main.c index 6971a46c7..e67e29538 100644 --- a/contrib/externalMatchfinder/main.c +++ b/contrib/externalSequenceProducer/main.c @@ -16,7 +16,7 @@ #define ZSTD_STATIC_LINKING_ONLY #include "zstd.h" #include "zstd_errors.h" -#include "matchfinder.h" // simpleExternalMatchFinder +#include "sequence_producer.h" // simpleSequenceProducer #define CHECK(res) \ do { \ @@ -28,23 +28,23 @@ do { \ int main(int argc, char *argv[]) { if (argc != 2) { - printf("Usage: exampleMatchfinder \n"); + printf("Usage: externalSequenceProducer \n"); return 1; } ZSTD_CCtx* const zc = ZSTD_createCCtx(); - int simpleExternalMatchState = 0xdeadbeef; + int simpleSequenceProducerState = 0xdeadbeef; // Here is the crucial bit of code! - ZSTD_registerExternalMatchFinder( + ZSTD_registerSequenceProducer( zc, - &simpleExternalMatchState, - simpleExternalMatchFinder + &simpleSequenceProducerState, + simpleSequenceProducer ); { - size_t const res = ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, 1); + size_t const res = ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, 1); CHECK(res); } diff --git a/contrib/externalMatchfinder/matchfinder.c b/contrib/externalSequenceProducer/sequence_producer.c similarity index 94% rename from contrib/externalMatchfinder/matchfinder.c rename to contrib/externalSequenceProducer/sequence_producer.c index f119193ef..60a2f9572 100644 --- a/contrib/externalMatchfinder/matchfinder.c +++ b/contrib/externalSequenceProducer/sequence_producer.c @@ -9,15 +9,15 @@ */ #include "zstd_compress_internal.h" -#include "matchfinder.h" +#include "sequence_producer.h" #define HSIZE 1024 static U32 const HLOG = 10; static U32 const MLS = 4; static U32 const BADIDX = 0xffffffff; -size_t simpleExternalMatchFinder( - void* externalMatchState, +size_t simpleSequenceProducer( + void* sequenceProducerState, ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, const void* src, size_t srcSize, const void* dict, size_t dictSize, @@ -31,7 +31,7 @@ size_t simpleExternalMatchFinder( size_t seqCount = 0; U32 hashTable[HSIZE]; - (void)externalMatchState; + (void)sequenceProducerState; (void)dict; (void)dictSize; (void)outSeqsCapacity; diff --git a/contrib/externalMatchfinder/matchfinder.h b/contrib/externalSequenceProducer/sequence_producer.h similarity index 91% rename from contrib/externalMatchfinder/matchfinder.h rename to contrib/externalSequenceProducer/sequence_producer.h index f8ba1c965..19f9982ac 100644 --- a/contrib/externalMatchfinder/matchfinder.h +++ b/contrib/externalSequenceProducer/sequence_producer.h @@ -14,8 +14,8 @@ #define ZSTD_STATIC_LINKING_ONLY #include "zstd.h" -size_t simpleExternalMatchFinder( - void* externalMatchState, +size_t simpleSequenceProducer( + void* sequenceProducerState, ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, const void* src, size_t srcSize, const void* dict, size_t dictSize, diff --git a/lib/common/error_private.c b/lib/common/error_private.c index 0cff6b80b..075fc5ef4 100644 --- a/lib/common/error_private.c +++ b/lib/common/error_private.c @@ -54,7 +54,7 @@ const char* ERR_getErrorString(ERR_enum code) case PREFIX(seekableIO): return "An I/O error occurred when reading/seeking"; case PREFIX(dstBuffer_wrong): return "Destination buffer is wrong"; case PREFIX(srcBuffer_wrong): return "Source buffer is wrong"; - case PREFIX(externalMatchFinder_failed): return "External matchfinder returned an error code"; + case PREFIX(sequenceProducer_failed): return "Block-level external sequence producer returned an error code"; case PREFIX(externalSequences_invalid): return "External sequences are not valid"; case PREFIX(maxCode): default: return notErrorCode; diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 5b89ca6d2..b55f684cd 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -615,7 +615,7 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param) bounds.upperBound = (int)ZSTD_ps_disable; return bounds; - case ZSTD_c_enableMatchFinderFallback: + case ZSTD_c_enableSeqProducerFallback: bounds.lowerBound = 0; bounds.upperBound = 1; return bounds; @@ -695,7 +695,7 @@ static int ZSTD_isUpdateAuthorized(ZSTD_cParameter param) case ZSTD_c_useRowMatchFinder: case ZSTD_c_deterministicRefPrefix: case ZSTD_c_prefetchCDictTables: - case ZSTD_c_enableMatchFinderFallback: + case ZSTD_c_enableSeqProducerFallback: case ZSTD_c_maxBlockSize: case ZSTD_c_searchForExternalRepcodes: default: @@ -754,7 +754,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value) case ZSTD_c_useRowMatchFinder: case ZSTD_c_deterministicRefPrefix: case ZSTD_c_prefetchCDictTables: - case ZSTD_c_enableMatchFinderFallback: + case ZSTD_c_enableSeqProducerFallback: case ZSTD_c_maxBlockSize: case ZSTD_c_searchForExternalRepcodes: break; @@ -989,8 +989,8 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams, CCtxParams->prefetchCDictTables = (ZSTD_paramSwitch_e)value; return CCtxParams->prefetchCDictTables; - case ZSTD_c_enableMatchFinderFallback: - BOUNDCHECK(ZSTD_c_enableMatchFinderFallback, value); + case ZSTD_c_enableSeqProducerFallback: + BOUNDCHECK(ZSTD_c_enableSeqProducerFallback, value); CCtxParams->enableMatchFinderFallback = value; return CCtxParams->enableMatchFinderFallback; @@ -1140,7 +1140,7 @@ size_t ZSTD_CCtxParams_getParameter( case ZSTD_c_prefetchCDictTables: *value = (int)CCtxParams->prefetchCDictTables; break; - case ZSTD_c_enableMatchFinderFallback: + case ZSTD_c_enableSeqProducerFallback: *value = CCtxParams->enableMatchFinderFallback; break; case ZSTD_c_maxBlockSize: @@ -1610,8 +1610,8 @@ ZSTD_sizeof_matchState(const ZSTD_compressionParameters* const cParams, /* Helper function for calculating memory requirements. * Gives a tighter bound than ZSTD_sequenceBound() by taking minMatch into account. */ -static size_t ZSTD_maxNbSeq(size_t blockSize, unsigned minMatch, int useExternalMatchFinder) { - U32 const divider = (minMatch==3 || useExternalMatchFinder) ? 3 : 4; +static size_t ZSTD_maxNbSeq(size_t blockSize, unsigned minMatch, int useSequenceProducer) { + U32 const divider = (minMatch==3 || useSequenceProducer) ? 3 : 4; return blockSize / divider; } @@ -1623,12 +1623,12 @@ static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( const size_t buffInSize, const size_t buffOutSize, const U64 pledgedSrcSize, - int useExternalMatchFinder, + int useSequenceProducer, size_t maxBlockSize) { size_t const windowSize = (size_t) BOUNDED(1ULL, 1ULL << cParams->windowLog, pledgedSrcSize); size_t const blockSize = MIN(ZSTD_resolveMaxBlockSize(maxBlockSize), windowSize); - size_t const maxNbSeq = ZSTD_maxNbSeq(blockSize, cParams->minMatch, useExternalMatchFinder); + size_t const maxNbSeq = ZSTD_maxNbSeq(blockSize, cParams->minMatch, useSequenceProducer); size_t const tokenSpace = ZSTD_cwksp_alloc_size(WILDCOPY_OVERLENGTH + blockSize) + ZSTD_cwksp_aligned_alloc_size(maxNbSeq * sizeof(seqDef)) + 3 * ZSTD_cwksp_alloc_size(maxNbSeq * sizeof(BYTE)); @@ -1648,7 +1648,7 @@ static size_t ZSTD_estimateCCtxSize_usingCCtxParams_internal( size_t const cctxSpace = isStatic ? ZSTD_cwksp_alloc_size(sizeof(ZSTD_CCtx)) : 0; size_t const maxNbExternalSeq = ZSTD_sequenceBound(blockSize); - size_t const externalSeqSpace = useExternalMatchFinder + size_t const externalSeqSpace = useSequenceProducer ? ZSTD_cwksp_aligned_alloc_size(maxNbExternalSeq * sizeof(ZSTD_Sequence)) : 0; @@ -1679,7 +1679,7 @@ size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params) * be needed. However, we still allocate two 0-sized buffers, which can * take space under ASAN. */ return ZSTD_estimateCCtxSize_usingCCtxParams_internal( - &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, 0, 0, ZSTD_CONTENTSIZE_UNKNOWN, params->useExternalMatchFinder, params->maxBlockSize); + &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, 0, 0, ZSTD_CONTENTSIZE_UNKNOWN, params->useSequenceProducer, params->maxBlockSize); } size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams) @@ -1740,7 +1740,7 @@ size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params) return ZSTD_estimateCCtxSize_usingCCtxParams_internal( &cParams, ¶ms->ldmParams, 1, useRowMatchFinder, inBuffSize, outBuffSize, - ZSTD_CONTENTSIZE_UNKNOWN, params->useExternalMatchFinder, params->maxBlockSize); + ZSTD_CONTENTSIZE_UNKNOWN, params->useSequenceProducer, params->maxBlockSize); } } @@ -2024,7 +2024,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, { size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << params->cParams.windowLog), pledgedSrcSize)); size_t const blockSize = MIN(params->maxBlockSize, windowSize); - size_t const maxNbSeq = ZSTD_maxNbSeq(blockSize, params->cParams.minMatch, params->useExternalMatchFinder); + size_t const maxNbSeq = ZSTD_maxNbSeq(blockSize, params->cParams.minMatch, params->useSequenceProducer); size_t const buffOutSize = (zbuff == ZSTDb_buffered && params->outBufferMode == ZSTD_bm_buffered) ? ZSTD_compressBound(blockSize) + 1 : 0; @@ -2041,7 +2041,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, size_t const neededSpace = ZSTD_estimateCCtxSize_usingCCtxParams_internal( ¶ms->cParams, ¶ms->ldmParams, zc->staticSize != 0, params->useRowMatchFinder, - buffInSize, buffOutSize, pledgedSrcSize, params->useExternalMatchFinder, params->maxBlockSize); + buffInSize, buffOutSize, pledgedSrcSize, params->useSequenceProducer, params->maxBlockSize); int resizeWorkspace; FORWARD_IF_ERROR(neededSpace, "cctx size estimate failed!"); @@ -2155,7 +2155,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, } /* reserve space for block-level external sequences */ - if (params->useExternalMatchFinder) { + if (params->useSequenceProducer) { size_t const maxNbExternalSeq = ZSTD_sequenceBound(blockSize); zc->externalMatchCtx.seqBufferCapacity = maxNbExternalSeq; zc->externalMatchCtx.seqBuffer = @@ -3022,26 +3022,26 @@ void ZSTD_resetSeqStore(seqStore_t* ssPtr) ssPtr->longLengthType = ZSTD_llt_none; } -/* ZSTD_postProcessExternalMatchFinderResult() : +/* ZSTD_postProcessSequenceProducerResult() : * Validates and post-processes sequences obtained through the external matchfinder API: * - Checks whether nbExternalSeqs represents an error condition. * - Appends a block delimiter to outSeqs if one is not already present. * See zstd.h for context regarding block delimiters. * Returns the number of sequences after post-processing, or an error code. */ -static size_t ZSTD_postProcessExternalMatchFinderResult( +static size_t ZSTD_postProcessSequenceProducerResult( ZSTD_Sequence* outSeqs, size_t nbExternalSeqs, size_t outSeqsCapacity, size_t srcSize ) { RETURN_ERROR_IF( nbExternalSeqs > outSeqsCapacity, - externalMatchFinder_failed, - "External matchfinder returned error code %lu", + sequenceProducer_failed, + "External sequence producer returned error code %lu", (unsigned long)nbExternalSeqs ); RETURN_ERROR_IF( nbExternalSeqs == 0 && srcSize > 0, - externalMatchFinder_failed, - "External matchfinder produced zero sequences for a non-empty src buffer!" + sequenceProducer_failed, + "Got zero sequences from external sequence producer for a non-empty src buffer!" ); if (srcSize == 0) { @@ -3061,7 +3061,7 @@ static size_t ZSTD_postProcessExternalMatchFinderResult( * produced an invalid parse, by definition of ZSTD_sequenceBound(). */ RETURN_ERROR_IF( nbExternalSeqs == outSeqsCapacity, - externalMatchFinder_failed, + sequenceProducer_failed, "nbExternalSeqs == outSeqsCapacity but lastSeq is not a block delimiter!" ); @@ -3139,9 +3139,9 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) /* External matchfinder + LDM is technically possible, just not implemented yet. * We need to revisit soon and implement it. */ RETURN_ERROR_IF( - zc->appliedParams.useExternalMatchFinder, + zc->appliedParams.useSequenceProducer, parameter_combination_unsupported, - "Long-distance matching with external matchfinder enabled is not currently supported." + "Long-distance matching with external sequence producer enabled is not currently supported." ); /* Updates ldmSeqStore.pos */ @@ -3158,9 +3158,9 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) /* External matchfinder + LDM is technically possible, just not implemented yet. * We need to revisit soon and implement it. */ RETURN_ERROR_IF( - zc->appliedParams.useExternalMatchFinder, + zc->appliedParams.useSequenceProducer, parameter_combination_unsupported, - "Long-distance matching with external matchfinder enabled is not currently supported." + "Long-distance matching with external sequence producer enabled is not currently supported." ); ldmSeqStore.seq = zc->ldmSequences; @@ -3177,7 +3177,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) zc->appliedParams.useRowMatchFinder, src, srcSize); assert(ldmSeqStore.pos == ldmSeqStore.size); - } else if (zc->appliedParams.useExternalMatchFinder) { + } else if (zc->appliedParams.useSequenceProducer) { assert( zc->externalMatchCtx.seqBufferCapacity >= ZSTD_sequenceBound(srcSize) ); @@ -3195,7 +3195,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) windowSize ); - size_t const nbPostProcessedSeqs = ZSTD_postProcessExternalMatchFinderResult( + size_t const nbPostProcessedSeqs = ZSTD_postProcessSequenceProducerResult( zc->externalMatchCtx.seqBuffer, nbExternalSeqs, zc->externalMatchCtx.seqBufferCapacity, @@ -3217,7 +3217,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) "Failed to copy external sequences to seqStore!" ); ms->ldmSeqStore = NULL; - DEBUGLOG(5, "Copied %lu sequences from external matchfinder to internal seqStore.", (unsigned long)nbExternalSeqs); + DEBUGLOG(5, "Copied %lu sequences from external sequence producer to internal seqStore.", (unsigned long)nbExternalSeqs); return ZSTDbss_compress; } @@ -3233,7 +3233,7 @@ static size_t ZSTD_buildSeqStore(ZSTD_CCtx* zc, const void* src, size_t srcSize) ms->ldmSeqStore = NULL; DEBUGLOG( 5, - "External matchfinder returned error code %lu. Falling back to internal matchfinder.", + "External sequence producer returned error code %lu. Falling back to internal parser.", (unsigned long)nbExternalSeqs ); lastLLSize = blockCompressor(ms, &zc->seqStore, zc->blockState.nextCBlock->rep, src, srcSize); @@ -6033,9 +6033,9 @@ static size_t ZSTD_CCtx_init_compressStream2(ZSTD_CCtx* cctx, #ifdef ZSTD_MULTITHREAD /* If external matchfinder is enabled, make sure to fail before checking job size (for consistency) */ RETURN_ERROR_IF( - params.useExternalMatchFinder == 1 && params.nbWorkers >= 1, + params.useSequenceProducer == 1 && params.nbWorkers >= 1, parameter_combination_unsupported, - "External matchfinder isn't supported with nbWorkers >= 1" + "External sequence producer isn't supported with nbWorkers >= 1" ); if ((cctx->pledgedSrcSizePlusOne-1) <= ZSTDMT_JOBSIZE_MIN) { @@ -6251,7 +6251,7 @@ size_t ZSTD_compress2(ZSTD_CCtx* cctx, */ static size_t ZSTD_validateSequence(U32 offCode, U32 matchLength, U32 minMatch, - size_t posInSrc, U32 windowLog, size_t dictSize, int useExternalMatchFinder) + size_t posInSrc, U32 windowLog, size_t dictSize, int useSequenceProducer) { U32 const windowSize = 1u << windowLog; /* posInSrc represents the amount of data the decoder would decode up to this point. @@ -6260,7 +6260,7 @@ ZSTD_validateSequence(U32 offCode, U32 matchLength, U32 minMatch, * window size. After output surpasses windowSize, we're limited to windowSize offsets again. */ size_t const offsetBound = posInSrc > windowSize ? (size_t)windowSize : posInSrc + (size_t)dictSize; - size_t const matchLenLowerBound = (minMatch == 3 || useExternalMatchFinder) ? 3 : 4; + size_t const matchLenLowerBound = (minMatch == 3 || useSequenceProducer) ? 3 : 4; RETURN_ERROR_IF(offCode > OFFSET_TO_OFFBASE(offsetBound), externalSequences_invalid, "Offset too large!"); /* Validate maxNbSeq is large enough for the given matchLength and minMatch */ RETURN_ERROR_IF(matchLength < matchLenLowerBound, externalSequences_invalid, "Matchlength too small for the minMatch"); @@ -6325,7 +6325,7 @@ ZSTD_copySequencesToSeqStoreExplicitBlockDelim(ZSTD_CCtx* cctx, if (cctx->appliedParams.validateSequences) { seqPos->posInSrc += litLength + matchLength; FORWARD_IF_ERROR(ZSTD_validateSequence(offBase, matchLength, cctx->appliedParams.cParams.minMatch, seqPos->posInSrc, - cctx->appliedParams.cParams.windowLog, dictSize, cctx->appliedParams.useExternalMatchFinder), + cctx->appliedParams.cParams.windowLog, dictSize, cctx->appliedParams.useSequenceProducer), "Sequence validation failed"); } RETURN_ERROR_IF(idx - seqPos->idx >= cctx->seqStore.maxNbSeq, externalSequences_invalid, @@ -6463,7 +6463,7 @@ ZSTD_copySequencesToSeqStoreNoBlockDelim(ZSTD_CCtx* cctx, ZSTD_sequencePosition* if (cctx->appliedParams.validateSequences) { seqPos->posInSrc += litLength + matchLength; FORWARD_IF_ERROR(ZSTD_validateSequence(offBase, matchLength, cctx->appliedParams.cParams.minMatch, seqPos->posInSrc, - cctx->appliedParams.cParams.windowLog, dictSize, cctx->appliedParams.useExternalMatchFinder), + cctx->appliedParams.cParams.windowLog, dictSize, cctx->appliedParams.useSequenceProducer), "Sequence validation failed"); } DEBUGLOG(6, "Storing sequence: (of: %u, ml: %u, ll: %u)", offBase, matchLength, litLength); @@ -6908,9 +6908,9 @@ ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long srcSizeH return ZSTD_getParams_internal(compressionLevel, srcSizeHint, dictSize, ZSTD_cpm_unknown); } -void ZSTD_registerExternalMatchFinder( +void ZSTD_registerSequenceProducer( ZSTD_CCtx* zc, void* mState, - ZSTD_externalMatchFinder_F* mFinder + ZSTD_sequenceProducer_F* mFinder ) { if (mFinder != NULL) { ZSTD_externalMatchCtx emctx; @@ -6919,9 +6919,9 @@ void ZSTD_registerExternalMatchFinder( emctx.seqBuffer = NULL; emctx.seqBufferCapacity = 0; zc->externalMatchCtx = emctx; - zc->requestedParams.useExternalMatchFinder = 1; + zc->requestedParams.useSequenceProducer = 1; } else { ZSTD_memset(&zc->externalMatchCtx, 0, sizeof(zc->externalMatchCtx)); - zc->requestedParams.useExternalMatchFinder = 0; + zc->requestedParams.useSequenceProducer = 0; } } diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index dac7a0aa2..cbb85e527 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -353,8 +353,8 @@ struct ZSTD_CCtx_params_s { /* Indicates whether an external matchfinder has been referenced. * Users can't set this externally. - * It is set internally in ZSTD_registerExternalMatchFinder(). */ - int useExternalMatchFinder; + * It is set internally in ZSTD_registerSequenceProducer(). */ + int useSequenceProducer; /* Adjust the max block size*/ size_t maxBlockSize; @@ -395,7 +395,7 @@ typedef struct { /* Context for block-level external matchfinder API */ typedef struct { void* mState; - ZSTD_externalMatchFinder_F* mFinder; + ZSTD_sequenceProducer_F* mFinder; ZSTD_Sequence* seqBuffer; size_t seqBufferCapacity; } ZSTD_externalMatchCtx; diff --git a/lib/zstd.h b/lib/zstd.h index 91a3679a1..95aac0737 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -478,7 +478,7 @@ typedef enum { * ZSTD_c_useBlockSplitter * ZSTD_c_useRowMatchFinder * ZSTD_c_prefetchCDictTables - * ZSTD_c_enableMatchFinderFallback + * ZSTD_c_enableSeqProducerFallback * ZSTD_c_maxBlockSize * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. * note : never ever use experimentalParam? names directly; @@ -565,7 +565,7 @@ typedef enum { * They will be used to compress next frame. * Resetting session never fails. * - The parameters : changes all parameters back to "default". - * This also removes any reference to any dictionary or external matchfinder. + * This also removes any reference to any dictionary or external sequence producer. * Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing) * otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError()) * - Both : similar to resetting the session, followed by resetting parameters. @@ -1627,8 +1627,8 @@ ZSTDLIB_API unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size); * Note : only single-threaded compression is supported. * ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. * - * Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the external matchfinder API at this time. - * Size estimates assume that no external matchfinder is registered. + * Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. */ ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int compressionLevel); ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); @@ -1650,8 +1650,8 @@ ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void); * In this case, get total size by adding ZSTD_estimate?DictSize * Note 2 : only single-threaded compression is supported. * ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. - * Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the external matchfinder API at this time. - * Size estimates assume that no external matchfinder is registered. + * Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + * Size estimates assume that no external sequence producer is registered. */ ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int compressionLevel); ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams); @@ -2113,19 +2113,19 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo */ #define ZSTD_c_prefetchCDictTables ZSTD_c_experimentalParam16 -/* ZSTD_c_enableMatchFinderFallback +/* ZSTD_c_enableSeqProducerFallback * Allowed values are 0 (disable) and 1 (enable). The default setting is 0. * - * Controls whether zstd will fall back to an internal matchfinder if an - * external matchfinder is registered and returns an error code. This fallback is - * block-by-block: the internal matchfinder will only be called for blocks where - * the external matchfinder returns an error code. Fallback compression will + * Controls whether zstd will fall back to an internal sequence producer if an + * external sequence producer is registered and returns an error code. This fallback + * is block-by-block: the internal sequence producer will only be called for blocks + * where the external sequence producer returns an error code. Fallback parsing will * follow any other cParam settings, such as compression level, the same as in a * normal (fully-internal) compression operation. * - * The user is strongly encouraged to read the full external matchfinder API + * The user is strongly encouraged to read the full Block-Level Sequence Producer API * documentation (below) before setting this parameter. */ -#define ZSTD_c_enableMatchFinderFallback ZSTD_c_experimentalParam17 +#define ZSTD_c_enableSeqProducerFallback ZSTD_c_experimentalParam17 /* ZSTD_c_maxBlockSize * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB). @@ -2141,12 +2141,13 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo /* ZSTD_c_searchForExternalRepcodes * This parameter affects how zstd parses external sequences, such as sequences - * provided through the compressSequences() API or from an external matchfinder. + * provided through the compressSequences() API or from an external block-level + * sequence producer. * * If set to ZSTD_ps_enable, the library will check for repeated offsets in * external sequences, even if those repcodes are not explicitly indicated in * the "rep" field. Note that this is the only way to exploit repcode matches - * while using compressSequences() or an external matchfinder, since zstd + * while using compressSequences() or an external sequence producer, since zstd * currently ignores the "rep" field of external sequences. * * If set to ZSTD_ps_disable, the library will not exploit repeated offsets in @@ -2805,43 +2806,52 @@ ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_ ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */ -/* ********************** EXTERNAL MATCHFINDER API ********************** +/* ********************* BLOCK-LEVEL SEQUENCE PRODUCER API ********************* * * *** OVERVIEW *** - * This API allows users to replace the zstd internal block-level matchfinder - * with an external matchfinder function. Potential applications of the API - * include hardware-accelerated matchfinders and matchfinders specialized to - * particular types of data. + * The Block-Level Sequence Producer API allows users to provide their own custom + * sequence producer which libzstd invokes to process each block. The produced list + * of sequences (literals and matches) is then post-processed by libzstd to produce + * valid compressed blocks. * - * See contrib/externalMatchfinder for an example program employing the - * external matchfinder API. + * This block-level offload API is a more granular complement of the existing + * frame-level offload API compressSequences() (introduced in v1.5.1). It offers + * an easier migration story for applications already integrated with libzstd: the + * user application continues to invoke the same compression functions + * ZSTD_compress2() or ZSTD_compressStream2() as usual, and transparently benefits + * from the specific advantages of the external sequence producer. For example, + * the sequence producer could be tuned to take advantage of known characteristics + * of the input, to offer better speed / ratio, or could leverage hardware + * acceleration not available within libzstd itself. + * + * See contrib/externalSequenceProducer for an example program employing the + * Block-Level Sequence Producer API. * * *** USAGE *** * The user is responsible for implementing a function of type - * ZSTD_externalMatchFinder_F. For each block, zstd will pass the following + * ZSTD_sequenceProducer_F. For each block, zstd will pass the following * arguments to the user-provided function: * - * - externalMatchState: a pointer to a user-managed state for the external - * matchfinder. + * - sequenceProducerState: a pointer to a user-managed state for the sequence + * producer. * - * - outSeqs, outSeqsCapacity: an output buffer for sequences produced by the - * external matchfinder. outSeqsCapacity is guaranteed >= - * ZSTD_sequenceBound(srcSize). The memory backing outSeqs is managed by - * the CCtx. + * - outSeqs, outSeqsCapacity: an output buffer for the sequence producer. + * outSeqsCapacity is guaranteed >= ZSTD_sequenceBound(srcSize). The memory + * backing outSeqs is managed by the CCtx. * - * - src, srcSize: an input buffer which the external matchfinder must parse - * into sequences. srcSize is guaranteed to be <= ZSTD_BLOCKSIZE_MAX. + * - src, srcSize: an input buffer for the sequence producer to parse. + * srcSize is guaranteed to be <= ZSTD_BLOCKSIZE_MAX. * - * - dict, dictSize: a history buffer, which may be empty, which the external - * matchfinder may reference as it produces sequences for the src buffer. - * Currently, zstd will always pass dictSize == 0 into external matchfinders, - * but this will change in the future. + * - dict, dictSize: a history buffer, which may be empty, which the sequence + * producer may reference as it parses the src buffer. Currently, zstd will + * always pass dictSize == 0 into external sequence producers, but this will + * change in the future. * * - compressionLevel: a signed integer representing the zstd compression level - * set by the user for the current operation. The external matchfinder may - * choose to use this information to change its compression strategy and - * speed/ratio tradeoff. Note: The compression level does not reflect zstd - * parameters set through the advanced API. + * set by the user for the current operation. The sequence producer may choose + * to use this information to change its compression strategy and speed/ratio + * tradeoff. Note: the compression level does not reflect zstd parameters set + * through the advanced API. * * - windowSize: a size_t representing the maximum allowed offset for external * sequences. Note that sequence offsets are sometimes allowed to exceed the @@ -2851,7 +2861,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* bloc * The user-provided function shall return a size_t representing the number of * sequences written to outSeqs. This return value will be treated as an error * code if it is greater than outSeqsCapacity. The return value must be non-zero - * if srcSize is non-zero. The ZSTD_EXTERNAL_MATCHFINDER_ERROR macro is provided + * if srcSize is non-zero. The ZSTD_SEQUENCE_PRODUCER_ERROR macro is provided * for convenience, but any value greater than outSeqsCapacity will be treated as * an error code. * @@ -2859,68 +2869,71 @@ ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* bloc * written to outSeqs must be a valid parse of the src buffer. Data corruption may * occur if the parse is not valid. A parse is defined to be valid if the * following conditions hold: - * - The sum of matchLengths and literalLengths is equal to srcSize. - * - All sequences in the parse have matchLength != 0, except for the final - * sequence. matchLength is not constrained for the final sequence. - * - All offsets respect the windowSize parameter as specified in + * - The sum of matchLengths and literalLengths must equal srcSize. + * - All sequences in the parse, except for the final sequence, must have + * matchLength >= ZSTD_MINMATCH_MIN. The final sequence must have + * matchLength >= ZSTD_MINMATCH_MIN or matchLength == 0. + * - All offsets must respect the windowSize parameter as specified in * doc/zstd_compression_format.md. + * - If the final sequence has matchLength == 0, it must also have offset == 0. * * zstd will only validate these conditions (and fail compression if they do not * hold) if the ZSTD_c_validateSequences cParam is enabled. Note that sequence * validation has a performance cost. * * If the user-provided function returns an error, zstd will either fall back - * to an internal matchfinder or fail the compression operation. The user can - * choose between the two behaviors by setting the - * ZSTD_c_enableMatchFinderFallback cParam. Fallback compression will follow any - * other cParam settings, such as compression level, the same as in a normal - * compression operation. + * to an internal sequence producer or fail the compression operation. The user can + * choose between the two behaviors by setting the ZSTD_c_enableSeqProducerFallback + * cParam. Fallback compression will follow any other cParam settings, such as + * compression level, the same as in a normal compression operation. * - * The user shall instruct zstd to use a particular ZSTD_externalMatchFinder_F - * function by calling ZSTD_registerExternalMatchFinder(cctx, externalMatchState, - * externalMatchFinder). This setting will persist until the next parameter reset - * of the CCtx. + * The user shall instruct zstd to use a particular ZSTD_sequenceProducer_F + * function by calling + * ZSTD_registerSequenceProducer(cctx, + * sequenceProducerState, + * sequenceProducer) + * This setting will persist until the next parameter reset of the CCtx. * - * The externalMatchState must be initialized by the user before calling - * ZSTD_registerExternalMatchFinder. The user is responsible for destroying the - * externalMatchState. + * The sequenceProducerState must be initialized by the user before calling + * ZSTD_registerSequenceProducer(). The user is responsible for destroying the + * sequenceProducerState. * * *** LIMITATIONS *** - * External matchfinders are compatible with all zstd compression APIs which respect - * advanced parameters. However, there are three limitations: + * This API is compatible with all zstd compression APIs which respect advanced parameters. + * However, there are three limitations: * - * First, the ZSTD_c_enableLongDistanceMatching cParam is not supported. - * COMPRESSION WILL FAIL if it is enabled and the user tries to compress with an - * external matchfinder. - * - Note that ZSTD_c_enableLongDistanceMatching is auto-enabled by default in - * some cases (see its documentation for details). Users must explicitly set - * ZSTD_c_enableLongDistanceMatching to ZSTD_ps_disable in such cases if an - * external matchfinder is registered. + * First, the ZSTD_c_enableLongDistanceMatching cParam is not currently supported. + * COMPRESSION WILL FAIL if it is enabled and the user tries to compress with a block-level + * external sequence producer. + * - Note that ZSTD_c_enableLongDistanceMatching is auto-enabled by default in some + * cases (see its documentation for details). Users must explicitly set + * ZSTD_c_enableLongDistanceMatching to ZSTD_ps_disable in such cases if an external + * sequence producer is registered. * - As of this writing, ZSTD_c_enableLongDistanceMatching is disabled by default * whenever ZSTD_c_windowLog < 128MB, but that's subject to change. Users should - * check the docs on ZSTD_c_enableLongDistanceMatching whenever the external - * matchfinder API is used in conjunction with advanced settings (like windowLog). + * check the docs on ZSTD_c_enableLongDistanceMatching whenever the Block-Level Sequence + * Producer API is used in conjunction with advanced settings (like ZSTD_c_windowLog). * - * Second, history buffers are not supported. Concretely, zstd will always pass - * dictSize == 0 to the external matchfinder (for now). This has two implications: - * - Dictionaries are not supported. Compression will *not* fail if the user + * Second, history buffers are not currently supported. Concretely, zstd will always pass + * dictSize == 0 to the external sequence producer (for now). This has two implications: + * - Dictionaries are not currently supported. Compression will *not* fail if the user * references a dictionary, but the dictionary won't have any effect. - * - Stream history is not supported. All compression APIs, including streaming - * APIs, work with the external matchfinder, but the external matchfinder won't - * receive any history from the previous block. Each block is an independent chunk. + * - Stream history is not currently supported. All advanced compression APIs, including + * streaming APIs, work with external sequence producers, but each block is treated as + * an independent chunk without history from previous blocks. * - * Third, multi-threading within a single compression is not supported. In other words, - * COMPRESSION WILL FAIL if ZSTD_c_nbWorkers > 0 and an external matchfinder is registered. + * Third, multi-threading within a single compression is not currently supported. In other words, + * COMPRESSION WILL FAIL if ZSTD_c_nbWorkers > 0 and an external sequence producer is registered. * Multi-threading across compressions is fine: simply create one CCtx per thread. * * Long-term, we plan to overcome all three limitations. There is no technical blocker to * overcoming them. It is purely a question of engineering effort. */ -#define ZSTD_EXTERNAL_MATCHFINDER_ERROR ((size_t)(-1)) +#define ZSTD_SEQUENCE_PRODUCER_ERROR ((size_t)(-1)) -typedef size_t ZSTD_externalMatchFinder_F ( - void* externalMatchState, +typedef size_t ZSTD_sequenceProducer_F ( + void* sequenceProducerState, ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, const void* src, size_t srcSize, const void* dict, size_t dictSize, @@ -2928,32 +2941,30 @@ typedef size_t ZSTD_externalMatchFinder_F ( size_t windowSize ); -/*! ZSTD_registerExternalMatchFinder() : - * Instruct zstd to use an external matchfinder function. +/*! ZSTD_registerSequenceProducer() : + * Instruct zstd to use a block-level external sequence producer function. * - * The externalMatchState must be initialized by the caller, and the caller is + * The sequenceProducerState must be initialized by the caller, and the caller is * responsible for managing its lifetime. This parameter is sticky across * compressions. It will remain set until the user explicitly resets compression * parameters. * - * External matchfinder registration is considered to be an "advanced parameter", - * part of the "advanced API". This means it will only have an effect on - * compression APIs which respect advanced parameters, such as compress2() and - * compressStream(). Older compression APIs such as compressCCtx(), which predate - * the introduction of "advanced parameters", will ignore any external matchfinder - * setting. + * Sequence producer registration is considered to be an "advanced parameter", + * part of the "advanced API". This means it will only have an effect on compression + * APIs which respect advanced parameters, such as compress2() and compressStream2(). + * Older compression APIs such as compressCCtx(), which predate the introduction of + * "advanced parameters", will ignore any external sequence producer setting. * - * The external matchfinder can be "cleared" by registering a NULL external - * matchfinder function pointer. This removes all limitations described above in - * the "LIMITATIONS" section of the API docs. + * The sequence producer can be "cleared" by registering a NULL function pointer. This + * removes all limitations described above in the "LIMITATIONS" section of the API docs. * - * The user is strongly encouraged to read the full API documentation (above) - * before calling this function. */ + * The user is strongly encouraged to read the full API documentation (above) before + * calling this function. */ ZSTDLIB_STATIC_API void -ZSTD_registerExternalMatchFinder( +ZSTD_registerSequenceProducer( ZSTD_CCtx* cctx, - void* externalMatchState, - ZSTD_externalMatchFinder_F* externalMatchFinder + void* sequenceProducerState, + ZSTD_sequenceProducer_F* sequenceProducer ); #endif /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */ diff --git a/lib/zstd_errors.h b/lib/zstd_errors.h index 6a66bedcb..dc75eeeba 100644 --- a/lib/zstd_errors.h +++ b/lib/zstd_errors.h @@ -95,7 +95,7 @@ typedef enum { ZSTD_error_seekableIO = 102, ZSTD_error_dstBuffer_wrong = 104, ZSTD_error_srcBuffer_wrong = 105, - ZSTD_error_externalMatchFinder_failed = 106, + ZSTD_error_sequenceProducer_failed = 106, ZSTD_error_externalSequences_invalid = 107, ZSTD_error_maxCode = 120 /* never EVER use this value directly, it can change in future versions! Use ZSTD_isError() instead */ } ZSTD_ErrorCode; diff --git a/tests/external_matchfinder.c b/tests/external_matchfinder.c index 97c47caff..76ad41126 100644 --- a/tests/external_matchfinder.c +++ b/tests/external_matchfinder.c @@ -17,8 +17,8 @@ static U32 const HLOG = 10; static U32 const MLS = 4; static U32 const BADIDX = 0xffffffff; -static size_t simpleExternalMatchFinder( - void* externalMatchState, +static size_t simpleSequenceProducer( + void* sequenceProducerState, ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, const void* src, size_t srcSize, const void* dict, size_t dictSize, @@ -32,7 +32,7 @@ static size_t simpleExternalMatchFinder( size_t seqCount = 0; U32 hashTable[HSIZE]; - (void)externalMatchState; + (void)sequenceProducerState; (void)dict; (void)dictSize; (void)outSeqsCapacity; @@ -80,15 +80,15 @@ static size_t simpleExternalMatchFinder( return seqCount; } -size_t zstreamExternalMatchFinder( - void* externalMatchState, +size_t zstreamSequenceProducer( + void* sequenceProducerState, ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, const void* src, size_t srcSize, const void* dict, size_t dictSize, int compressionLevel, size_t windowSize ) { - EMF_testCase const testCase = *((EMF_testCase*)externalMatchState); + EMF_testCase const testCase = *((EMF_testCase*)sequenceProducerState); memset(outSeqs, 0, outSeqsCapacity); switch (testCase) { @@ -100,8 +100,8 @@ size_t zstreamExternalMatchFinder( outSeqs[0].litLength = (U32)(srcSize); return 1; case EMF_LOTS_OF_SEQS: - return simpleExternalMatchFinder( - externalMatchState, + return simpleSequenceProducer( + sequenceProducerState, outSeqs, outSeqsCapacity, src, srcSize, dict, dictSize, @@ -135,6 +135,6 @@ size_t zstreamExternalMatchFinder( return outSeqsCapacity + 1; case EMF_BIG_ERROR: default: - return ZSTD_EXTERNAL_MATCHFINDER_ERROR; + return ZSTD_SEQUENCE_PRODUCER_ERROR; } } diff --git a/tests/external_matchfinder.h b/tests/external_matchfinder.h index 7550bbceb..e38dc25ca 100644 --- a/tests/external_matchfinder.h +++ b/tests/external_matchfinder.h @@ -27,8 +27,8 @@ typedef enum { EMF_INVALID_LAST_LITS = 8 } EMF_testCase; -size_t zstreamExternalMatchFinder( - void* externalMatchState, +size_t zstreamSequenceProducer( + void* sequenceProducerState, ZSTD_Sequence* outSeqs, size_t outSeqsCapacity, const void* src, size_t srcSize, const void* dict, size_t dictSize, diff --git a/tests/fuzz/Makefile b/tests/fuzz/Makefile index 4b5102ef1..bbb262add 100644 --- a/tests/fuzz/Makefile +++ b/tests/fuzz/Makefile @@ -35,8 +35,8 @@ PRGDIR = ../../programs CONTRIBDIR = ../../contrib # TODO(embg) make it possible to plug in an arbitrary matchfinder as a .o file -MATCHFINDER_DIR = $(CONTRIBDIR)/externalMatchfinder -MATCHFINDER_SRC = $(MATCHFINDER_DIR)/matchfinder.c +MATCHFINDER_DIR = $(CONTRIBDIR)/externalSequenceProducer +MATCHFINDER_SRC = $(MATCHFINDER_DIR)/sequence_producer.c FUZZ_CPPFLAGS := -I$(ZSTDDIR) -I$(ZSTDDIR)/common -I$(ZSTDDIR)/compress \ -I$(ZSTDDIR)/dictBuilder -I$(ZSTDDIR)/deprecated -I$(ZSTDDIR)/legacy \ diff --git a/tests/fuzz/zstd_helpers.c b/tests/fuzz/zstd_helpers.c index 6b833471e..411b6391c 100644 --- a/tests/fuzz/zstd_helpers.c +++ b/tests/fuzz/zstd_helpers.c @@ -17,7 +17,7 @@ #include "fuzz_helpers.h" #include "zstd.h" #include "zdict.h" -#include "matchfinder.h" +#include "sequence_producer.h" const int kMinClevel = -3; const int kMaxClevel = 19; @@ -71,13 +71,13 @@ ZSTD_parameters FUZZ_randomParams(size_t srcSize, FUZZ_dataProducer_t *producer) return params; } -static void setExternalMatchFinderParams(ZSTD_CCtx *cctx, FUZZ_dataProducer_t *producer) { - ZSTD_registerExternalMatchFinder( +static void setSequenceProducerParams(ZSTD_CCtx *cctx, FUZZ_dataProducer_t *producer) { + ZSTD_registerSequenceProducer( cctx, NULL, - simpleExternalMatchFinder + simpleSequenceProducer ); - setRand(cctx, ZSTD_c_enableMatchFinderFallback, 0, 1, producer); + setRand(cctx, ZSTD_c_enableSeqProducerFallback, 0, 1, producer); FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 0)); FUZZ_ZASSERT(ZSTD_CCtx_setParameter(cctx, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_disable)); } @@ -138,9 +138,9 @@ void FUZZ_setRandomParameters(ZSTD_CCtx *cctx, size_t srcSize, FUZZ_dataProducer } if (FUZZ_dataProducer_uint32Range(producer, 0, 10) == 1) { - setExternalMatchFinderParams(cctx, producer); + setSequenceProducerParams(cctx, producer); } else { - ZSTD_registerExternalMatchFinder(cctx, NULL, NULL); + ZSTD_registerSequenceProducer(cctx, NULL, NULL); } } diff --git a/tests/zstreamtest.c b/tests/zstreamtest.c index aff847b4d..14c4af82f 100644 --- a/tests/zstreamtest.c +++ b/tests/zstreamtest.c @@ -40,7 +40,7 @@ #include "seqgen.h" #include "util.h" #include "timefn.h" /* UTIL_time_t, UTIL_clockSpanMicro, UTIL_getTime */ -#include "external_matchfinder.h" /* zstreamExternalMatchFinder, EMF_testCase */ +#include "external_matchfinder.h" /* zstreamSequenceProducer, EMF_testCase */ /*-************************************ * Constants @@ -1856,14 +1856,14 @@ static int basicUnitTests(U32 seed, double compressibility, int bigTests) } DISPLAYLEVEL(3, "OK \n"); - DISPLAYLEVEL(3, "test%3i : External matchfinder API: ", testNb++); + DISPLAYLEVEL(3, "test%3i : Block-Level External Sequence Producer API: ", testNb++); { size_t const dstBufSize = ZSTD_compressBound(CNBufferSize); BYTE* const dstBuf = (BYTE*)malloc(ZSTD_compressBound(dstBufSize)); size_t const checkBufSize = CNBufferSize; BYTE* const checkBuf = (BYTE*)malloc(checkBufSize); int enableFallback; - EMF_testCase externalMatchState; + EMF_testCase sequenceProducerState; CHECK(dstBuf == NULL || checkBuf == NULL, "allocation failed"); @@ -1871,7 +1871,7 @@ static int basicUnitTests(U32 seed, double compressibility, int bigTests) /* Reference external matchfinder outside the test loop to * check that the reference is preserved across compressions */ - ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder); + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); for (enableFallback = 0; enableFallback <= 1; enableFallback++) { size_t testCaseId; @@ -1892,9 +1892,9 @@ static int basicUnitTests(U32 seed, double compressibility, int bigTests) ZSTD_ErrorCode const errorCodes[] = { ZSTD_error_no_error, ZSTD_error_no_error, - ZSTD_error_externalMatchFinder_failed, - ZSTD_error_externalMatchFinder_failed, - ZSTD_error_externalMatchFinder_failed, + ZSTD_error_sequenceProducer_failed, + ZSTD_error_sequenceProducer_failed, + ZSTD_error_sequenceProducer_failed, ZSTD_error_externalSequences_invalid, ZSTD_error_externalSequences_invalid, ZSTD_error_externalSequences_invalid, @@ -1906,18 +1906,18 @@ static int basicUnitTests(U32 seed, double compressibility, int bigTests) int const compressionShouldSucceed = ( (errorCodes[testCaseId] == ZSTD_error_no_error) || - (enableFallback && errorCodes[testCaseId] == ZSTD_error_externalMatchFinder_failed) + (enableFallback && errorCodes[testCaseId] == ZSTD_error_sequenceProducer_failed) ); int const testWithSequenceValidation = ( testCases[testCaseId] == EMF_INVALID_OFFSET ); - externalMatchState = testCases[testCaseId]; + sequenceProducerState = testCases[testCaseId]; ZSTD_CCtx_reset(zc, ZSTD_reset_session_only); CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_validateSequences, testWithSequenceValidation)); - CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, enableFallback)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, enableFallback)); res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize); if (compressionShouldSucceed) { @@ -1936,9 +1936,9 @@ static int basicUnitTests(U32 seed, double compressibility, int bigTests) /* Test compression with external matchfinder + empty src buffer */ { size_t res; - externalMatchState = EMF_ZERO_SEQS; + sequenceProducerState = EMF_ZERO_SEQS; ZSTD_CCtx_reset(zc, ZSTD_reset_session_only); - CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, enableFallback)); + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, enableFallback)); res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, 0); CHECK(ZSTD_isError(res), "EMF: Compression error: %s", ZSTD_getErrorName(res)); CHECK(ZSTD_decompress(checkBuf, checkBufSize, dstBuf, res) != 0, "EMF: Empty src round trip failed!"); @@ -1947,30 +1947,30 @@ static int basicUnitTests(U32 seed, double compressibility, int bigTests) /* Test that reset clears the external matchfinder */ CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters)); - externalMatchState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder wasn't cleared */ - CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, 0)); + sequenceProducerState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder wasn't cleared */ + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, 0)); CHECK_Z(ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize)); /* Test that registering mFinder == NULL clears the external matchfinder */ ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters); - ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder); - externalMatchState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder wasn't cleared */ - CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, 0)); - ZSTD_registerExternalMatchFinder(zc, NULL, NULL); /* clear the external matchfinder */ + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); + sequenceProducerState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder wasn't cleared */ + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, 0)); + ZSTD_registerSequenceProducer(zc, NULL, NULL); /* clear the external matchfinder */ CHECK_Z(ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize)); /* Test that external matchfinder doesn't interact with older APIs */ ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters); - ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder); - externalMatchState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder is used */ - CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableMatchFinderFallback, 0)); + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); + sequenceProducerState = EMF_BIG_ERROR; /* ensure zstd will fail if the matchfinder is used */ + CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableSeqProducerFallback, 0)); CHECK_Z(ZSTD_compressCCtx(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize, 3)); /* Test that compression returns the correct error with LDM */ CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters)); { size_t res; - ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder); + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_enableLongDistanceMatching, ZSTD_ps_enable)); res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize); CHECK(!ZSTD_isError(res), "EMF: Should have raised an error!"); @@ -1985,7 +1985,7 @@ static int basicUnitTests(U32 seed, double compressibility, int bigTests) CHECK_Z(ZSTD_CCtx_reset(zc, ZSTD_reset_session_and_parameters)); { size_t res; - ZSTD_registerExternalMatchFinder(zc, &externalMatchState, zstreamExternalMatchFinder); + ZSTD_registerSequenceProducer(zc, &sequenceProducerState, zstreamSequenceProducer); CHECK_Z(ZSTD_CCtx_setParameter(zc, ZSTD_c_nbWorkers, 1)); res = ZSTD_compress2(zc, dstBuf, dstBufSize, CNBuffer, CNBufferSize); CHECK(!ZSTD_isError(res), "EMF: Should have raised an error!"); From 95ffc767f62e8aaeba363af49a590f8662cc2465 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 9 Feb 2023 14:40:39 -0800 Subject: [PATCH 471/472] updated man pages --- doc/zstd_manual.html | 45 ++++--- programs/zstd.1 | 279 ++++++++----------------------------------- programs/zstdgrep.1 | 21 +--- programs/zstdless.1 | 13 +- 4 files changed, 85 insertions(+), 273 deletions(-) diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index 2ea5c2010..c33f0e262 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -384,7 +384,7 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx);
/* accept NULL pointer */ * ZSTD_c_useBlockSplitter * ZSTD_c_useRowMatchFinder * ZSTD_c_prefetchCDictTables - * ZSTD_c_enableMatchFinderFallback + * ZSTD_c_enableSeqProducerFallback * ZSTD_c_maxBlockSize * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them. * note : never ever use experimentalParam? names directly; @@ -407,7 +407,8 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer */ ZSTD_c_experimentalParam15=1012, ZSTD_c_experimentalParam16=1013, ZSTD_c_experimentalParam17=1014, - ZSTD_c_experimentalParam18=1015 + ZSTD_c_experimentalParam18=1015, + ZSTD_c_experimentalParam19=1016 } ZSTD_cParameter;

typedef struct {
@@ -470,7 +471,7 @@ size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
                   They will be used to compress next frame.
                   Resetting session never fails.
   - The parameters : changes all parameters back to "default".
-                  This also removes any reference to any dictionary or external matchfinder.
+                  This also removes any reference to any dictionary or external sequence producer.
                   Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing)
                   otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError())
   - Both : similar to resetting the session, followed by resetting parameters.
@@ -1377,8 +1378,8 @@ ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void);
   Note : only single-threaded compression is supported.
   ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.
 
-  Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the external matchfinder API at this time.
-  Size estimates assume that no external matchfinder is registered.
+  Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time.
+  Size estimates assume that no external sequence producer is registered.
  
 


@@ -1401,8 +1402,8 @@ ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, si In this case, get total size by adding ZSTD_estimate?DictSize Note 2 : only single-threaded compression is supported. ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1. - Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the external matchfinder API at this time. - Size estimates assume that no external matchfinder is registered. + Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time. + Size estimates assume that no external sequence producer is registered.


@@ -2051,31 +2052,29 @@ ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_ ZSTDLIB_STATIC_API size_t ZSTD_insertBlock (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize);
/**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */

ZSTDLIB_STATIC_API void
-ZSTD_registerExternalMatchFinder(
+ZSTD_registerSequenceProducer(
   ZSTD_CCtx* cctx,
-  void* externalMatchState,
-  ZSTD_externalMatchFinder_F* externalMatchFinder
+  void* sequenceProducerState,
+  ZSTD_sequenceProducer_F* sequenceProducer
 );
-

Instruct zstd to use an external matchfinder function. +

Instruct zstd to use a block-level external sequence producer function. - The externalMatchState must be initialized by the caller, and the caller is + The sequenceProducerState must be initialized by the caller, and the caller is responsible for managing its lifetime. This parameter is sticky across compressions. It will remain set until the user explicitly resets compression parameters. - External matchfinder registration is considered to be an "advanced parameter", - part of the "advanced API". This means it will only have an effect on - compression APIs which respect advanced parameters, such as compress2() and - compressStream(). Older compression APIs such as compressCCtx(), which predate - the introduction of "advanced parameters", will ignore any external matchfinder - setting. + Sequence producer registration is considered to be an "advanced parameter", + part of the "advanced API". This means it will only have an effect on compression + APIs which respect advanced parameters, such as compress2() and compressStream2(). + Older compression APIs such as compressCCtx(), which predate the introduction of + "advanced parameters", will ignore any external sequence producer setting. - The external matchfinder can be "cleared" by registering a NULL external - matchfinder function pointer. This removes all limitations described above in - the "LIMITATIONS" section of the API docs. + The sequence producer can be "cleared" by registering a NULL function pointer. This + removes all limitations described above in the "LIMITATIONS" section of the API docs. - The user is strongly encouraged to read the full API documentation (above) - before calling this function. + The user is strongly encouraged to read the full API documentation (above) before + calling this function.


diff --git a/programs/zstd.1 b/programs/zstd.1 index e81ac9615..edc128fd1 100644 --- a/programs/zstd.1 +++ b/programs/zstd.1 @@ -1,554 +1,381 @@ -. -.TH "ZSTD" "1" "December 2022" "zstd 1.5.3" "User Commands" -. +.TH "ZSTD" "1" "February 2023" "zstd 1.5.4" "User Commands" .SH "NAME" \fBzstd\fR \- zstd, zstdmt, unzstd, zstdcat \- Compress or decompress \.zst files -. .SH "SYNOPSIS" -\fBzstd\fR [\fIOPTIONS\fR] [\-|\fIINPUT\-FILE\fR] [\-o \fIOUTPUT\-FILE\fR] -. +.TS +allbox; +\fBzstd\fR [\fIOPTIONS\fR] [\- \fIINPUT\-FILE\fR] [\-o \fIOUTPUT\-FILE\fR] +.TE .P \fBzstdmt\fR is equivalent to \fBzstd \-T0\fR -. .P \fBunzstd\fR is equivalent to \fBzstd \-d\fR -. .P \fBzstdcat\fR is equivalent to \fBzstd \-dcf\fR -. .SH "DESCRIPTION" \fBzstd\fR is a fast lossless compression algorithm and data compression tool, with command line syntax similar to \fBgzip\fR(1) and \fBxz\fR(1)\. It is based on the \fBLZ77\fR family, with further FSE & huff0 entropy stages\. \fBzstd\fR offers highly configurable compression speed, from fast modes at > 200 MB/s per core, to strong modes with excellent compression ratios\. It also features a very fast decoder, with speeds > 500 MB/s per core\. -. .P \fBzstd\fR command line syntax is generally similar to gzip, but features the following differences: -. -.IP "\(bu" 4 +.IP "\[ci]" 4 Source files are preserved by default\. It\'s possible to remove them automatically by using the \fB\-\-rm\fR command\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 When compressing a single file, \fBzstd\fR displays progress notifications and result summary by default\. Use \fB\-q\fR to turn them off\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fBzstd\fR displays a short help page when command line is an error\. Use \fB\-q\fR to turn it off\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fBzstd\fR does not accept input from console, though it does accept \fBstdin\fR when it\'s not the console\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fBzstd\fR does not store the input\'s filename or attributes, only its contents\. -. .IP "" 0 -. .P \fBzstd\fR processes each \fIfile\fR according to the selected operation mode\. If no \fIfiles\fR are given or \fIfile\fR is \fB\-\fR, \fBzstd\fR reads from standard input and writes the processed data to standard output\. \fBzstd\fR will refuse to write compressed data to standard output if it is a terminal: it will display an error message and skip the file\. Similarly, \fBzstd\fR will refuse to read compressed data from standard input if it is a terminal\. -. .P Unless \fB\-\-stdout\fR or \fB\-o\fR is specified, \fIfiles\fR are written to a new file whose name is derived from the source \fIfile\fR name: -. -.IP "\(bu" 4 +.IP "\[ci]" 4 When compressing, the suffix \fB\.zst\fR is appended to the source filename to get the target filename\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 When decompressing, the \fB\.zst\fR suffix is removed from the source filename to get the target filename -. .IP "" 0 -. .SS "Concatenation with \.zst Files" It is possible to concatenate multiple \fB\.zst\fR files\. \fBzstd\fR will decompress such agglomerated file as if it was a single \fB\.zst\fR file\. -. .SH "OPTIONS" -. .SS "Integer Suffixes and Special Values" In most places where an integer argument is expected, an optional suffix is supported to easily indicate large integers\. There must be no space between the integer and the suffix\. -. .TP \fBKiB\fR -Multiply the integer by 1,024 (2^10)\. \fBKi\fR, \fBK\fR, and \fBKB\fR are accepted as synonyms for \fBKiB\fR\. -. +Multiply the integer by 1,024 (2\e^10)\. \fBKi\fR, \fBK\fR, and \fBKB\fR are accepted as synonyms for \fBKiB\fR\. .TP \fBMiB\fR -Multiply the integer by 1,048,576 (2^20)\. \fBMi\fR, \fBM\fR, and \fBMB\fR are accepted as synonyms for \fBMiB\fR\. -. +Multiply the integer by 1,048,576 (2\e^20)\. \fBMi\fR, \fBM\fR, and \fBMB\fR are accepted as synonyms for \fBMiB\fR\. .SS "Operation Mode" If multiple operation mode options are given, the last one takes effect\. -. .TP \fB\-z\fR, \fB\-\-compress\fR Compress\. This is the default operation mode when no operation mode option is specified and no other operation mode is implied from the command name (for example, \fBunzstd\fR implies \fB\-\-decompress\fR)\. -. .TP \fB\-d\fR, \fB\-\-decompress\fR, \fB\-\-uncompress\fR Decompress\. -. .TP \fB\-t\fR, \fB\-\-test\fR Test the integrity of compressed \fIfiles\fR\. This option is equivalent to \fB\-\-decompress \-\-stdout > /dev/null\fR, decompressed data is discarded and checksummed for errors\. No files are created or removed\. -. .TP \fB\-b#\fR Benchmark file(s) using compression level \fI#\fR\. See \fIBENCHMARK\fR below for a description of this operation\. -. .TP \fB\-\-train FILES\fR Use \fIFILES\fR as a training set to create a dictionary\. The training set should contain a lot of small files (> 100)\. See \fIDICTIONARY BUILDER\fR below for a description of this operation\. -. .TP \fB\-l\fR, \fB\-\-list\fR Display information related to a zstd compressed file, such as size, ratio, and checksum\. Some of these fields may not be available\. This command\'s output can be augmented with the \fB\-v\fR modifier\. -. .SS "Operation Modifiers" -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-#\fR: selects \fB#\fR compression level [1\-19] (default: 3) -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-ultra\fR: unlocks high compression levels 20+ (maximum 22), using a lot more memory\. Note that decompression will also require more memory when using these levels\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-fast[=#]\fR: switch to ultra\-fast compression levels\. If \fB=#\fR is not present, it defaults to \fB1\fR\. The higher the value, the faster the compression speed, at the cost of some compression ratio\. This setting overwrites compression level if one was set previously\. Similarly, if a compression level is set after \fB\-\-fast\fR, it overrides it\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-T#\fR, \fB\-\-threads=#\fR: Compress using \fB#\fR working threads (default: 1)\. If \fB#\fR is 0, attempt to detect and use the number of physical CPU cores\. In all cases, the nb of threads is capped to \fBZSTDMT_NBWORKERS_MAX\fR, which is either 64 in 32\-bit mode, or 256 for 64\-bit environments\. This modifier does nothing if \fBzstd\fR is compiled without multithread support\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-single\-thread\fR: Use a single thread for both I/O and compression\. As compression is serialized with I/O, this can be slightly slower\. Single\-thread mode features significantly lower memory usage, which can be useful for systems with limited amount of memory, such as 32\-bit systems\. -. .IP Note 1: this mode is the only available one when multithread support is disabled\. -. .IP Note 2: this mode is different from \fB\-T1\fR, which spawns 1 compression thread in parallel with I/O\. Final compressed result is also slightly different from \fB\-T1\fR\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-auto\-threads={physical,logical} (default: physical)\fR: When using a default amount of threads via \fB\-T0\fR, choose the default based on the number of detected physical or logical cores\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-adapt[=min=#,max=#]\fR: \fBzstd\fR will dynamically adapt compression level to perceived I/O conditions\. Compression level adaptation can be observed live by using command \fB\-v\fR\. Adaptation can be constrained between supplied \fBmin\fR and \fBmax\fR levels\. The feature works when combined with multi\-threading and \fB\-\-long\fR mode\. It does not work with \fB\-\-single\-thread\fR\. It sets window size to 8 MiB by default (can be changed manually, see \fBwlog\fR)\. Due to the chaotic nature of dynamic adaptation, compressed result is not reproducible\. -. .IP \fINote\fR: at the time of this writing, \fB\-\-adapt\fR can remain stuck at low speed when combined with multiple worker threads (>=2)\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-long[=#]\fR: enables long distance matching with \fB#\fR \fBwindowLog\fR, if \fB#\fR is not present it defaults to \fB27\fR\. This increases the window size (\fBwindowLog\fR) and memory usage for both the compressor and decompressor\. This setting is designed to improve the compression ratio for files with long matches at a large distance\. -. .IP Note: If \fBwindowLog\fR is set to larger than 27, \fB\-\-long=windowLog\fR or \fB\-\-memory=windowSize\fR needs to be passed to the decompressor\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-D DICT\fR: use \fBDICT\fR as Dictionary to compress or decompress FILE(s) -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-patch\-from FILE\fR: Specify the file to be used as a reference point for zstd\'s diff engine\. This is effectively dictionary compression with some convenient parameter selection, namely that \fIwindowSize\fR > \fIsrcSize\fR\. -. .IP Note: cannot use both this and \fB\-D\fR together\. -. .IP Note: \fB\-\-long\fR mode will be automatically activated if \fIchainLog\fR < \fIfileLog\fR (\fIfileLog\fR being the \fIwindowLog\fR required to cover the whole file)\. You can also manually force it\. -. .IP Note: for all levels, you can use \fB\-\-patch\-from\fR in \fB\-\-single\-thread\fR mode to improve compression ratio at the cost of speed\. -. .IP Note: for level 19, you can get increased compression ratio at the cost of speed by specifying \fB\-\-zstd=targetLength=\fR to be something large (i\.e\. 4096), and by setting a large \fB\-\-zstd=chainLog=\fR\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-rsyncable\fR: \fBzstd\fR will periodically synchronize the compression state to make the compressed file more rsync\-friendly\. There is a negligible impact to compression ratio, and the faster compression levels will see a small compression speed hit\. This feature does not work with \fB\-\-single\-thread\fR\. You probably don\'t want to use it with long range mode, since it will decrease the effectiveness of the synchronization points, but your mileage may vary\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-C\fR, \fB\-\-[no\-]check\fR: add integrity check computed from uncompressed data (default: enabled) -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-[no\-]content\-size\fR: enable / disable whether or not the original size of the file is placed in the header of the compressed file\. The default option is \fB\-\-content\-size\fR (meaning that the original size will be placed in the header)\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-no\-dictID\fR: do not store dictionary ID within frame header (dictionary compression)\. The decoder will have to rely on implicit knowledge about which dictionary to use, it won\'t be able to check if it\'s correct\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-M#\fR, \fB\-\-memory=#\fR: Set a memory usage limit\. By default, \fBzstd\fR uses 128 MiB for decompression as the maximum amount of memory the decompressor is allowed to use, but you can override this manually if need be in either direction (i\.e\. you can increase or decrease it)\. -. .IP This is also used during compression when using with \fB\-\-patch\-from=\fR\. In this case, this parameter overrides that maximum size allowed for a dictionary\. (128 MiB)\. -. .IP Additionally, this can be used to limit memory for dictionary training\. This parameter overrides the default limit of 2 GiB\. zstd will load training samples up to the memory limit and ignore the rest\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-stream\-size=#\fR: Sets the pledged source size of input coming from a stream\. This value must be exact, as it will be included in the produced frame header\. Incorrect stream sizes will cause an error\. This information will be used to better optimize compression parameters, resulting in better and potentially faster compression, especially for smaller source sizes\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-size\-hint=#\fR: When handling input from a stream, \fBzstd\fR must guess how large the source size will be when optimizing compression parameters\. If the stream size is relatively small, this guess may be a poor one, resulting in a higher compression ratio than expected\. This feature allows for controlling the guess when needed\. Exact guesses result in better compression ratios\. Overestimates result in slightly degraded compression ratios, while underestimates may result in significant degradation\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-o FILE\fR: save result into \fBFILE\fR\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-f\fR, \fB\-\-force\fR: disable input and output checks\. Allows overwriting existing files, input from console, output to stdout, operating on links, block devices, etc\. During decompression and when the output destination is stdout, pass\-through unrecognized formats as\-is\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-c\fR, \fB\-\-stdout\fR: write to standard output (even if it is the console); keep original files unchanged\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-[no\-]sparse\fR: enable / disable sparse FS support, to make files with many zeroes smaller on disk\. Creating sparse files may save disk space and speed up decompression by reducing the amount of disk I/O\. default: enabled when output is into a file, and disabled when output is stdout\. This setting overrides default and can force sparse mode over stdout\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-[no\-]pass\-through\fR enable / disable passing through uncompressed files as\-is\. During decompression when pass\-through is enabled, unrecognized formats will be copied as\-is from the input to the output\. By default, pass\-through will occur when the output destination is stdout and the force (\fB\-f\fR) option is set\. -. -.IP "\(bu" 4 -\fB\-\-rm\fR: remove source file(s) after successful compression or decompression\. If used in combination with \fB\-o\fR, will trigger a confirmation prompt (which can be silenced with \fB\-f\fR), as this is a destructive operation\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 +\fB\-\-rm\fR: remove source file(s) after successful compression or decompression\. This command is silently ignored if output is \fBstdout\fR\. If used in combination with \fB\-o\fR, triggers a confirmation prompt (which can be silenced with \fB\-f\fR), as this is a destructive operation\. +.IP "\[ci]" 4 \fB\-k\fR, \fB\-\-keep\fR: keep source file(s) after successful compression or decompression\. This is the default behavior\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-r\fR: operate recursively on directories\. It selects all files in the named directory and all its subdirectories\. This can be useful both to reduce command line typing, and to circumvent shell expansion limitations, when there are a lot of files and naming breaks the maximum size of a command line\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-filelist FILE\fR read a list of files to process as content from \fBFILE\fR\. Format is compatible with \fBls\fR output, with one file per line\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-output\-dir\-flat DIR\fR: resulting files are stored into target \fBDIR\fR directory, instead of same directory as origin file\. Be aware that this command can introduce name collision issues, if multiple files, from different directories, end up having the same name\. Collision resolution ensures first file with a given name will be present in \fBDIR\fR, while in combination with \fB\-f\fR, the last file will be present instead\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-output\-dir\-mirror DIR\fR: similar to \fB\-\-output\-dir\-flat\fR, the output files are stored underneath target \fBDIR\fR directory, but this option will replicate input directory hierarchy into output \fBDIR\fR\. -. .IP If input directory contains "\.\.", the files in this directory will be ignored\. If input directory is an absolute directory (i\.e\. "/var/tmp/abc"), it will be stored into the "output\-dir/var/tmp/abc"\. If there are multiple input files or directories, name collision resolution will follow the same rules as \fB\-\-output\-dir\-flat\fR\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-format=FORMAT\fR: compress and decompress in other formats\. If compiled with support, zstd can compress to or decompress from other compression algorithm formats\. Possibly available options are \fBzstd\fR, \fBgzip\fR, \fBxz\fR, \fBlzma\fR, and \fBlz4\fR\. If no such format is provided, \fBzstd\fR is the default\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-h\fR/\fB\-H\fR, \fB\-\-help\fR: display help/long help and exit -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-V\fR, \fB\-\-version\fR: display version number and exit\. Advanced: \fB\-vV\fR also displays supported formats\. \fB\-vvV\fR also displays POSIX support\. \fB\-q\fR will only display the version number, suitable for machine reading\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-v\fR, \fB\-\-verbose\fR: verbose mode, display more information -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-q\fR, \fB\-\-quiet\fR: suppress warnings, interactivity, and notifications\. specify twice to suppress errors too\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-no\-progress\fR: do not display the progress bar, but keep all other messages\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-show\-default\-cparams\fR: shows the default compression parameters that will be used for a particular input file, based on the provided compression level and the input size\. If the provided file is not a regular file (e\.g\. a pipe), this flag will output the parameters used for inputs of unknown size\. -. -.IP "\(bu" 4 +.IP "\[ci]" 4 \fB\-\-\fR: All arguments after \fB\-\-\fR are treated as files -. .IP "" 0 -. .SS "gzip Operation Modifiers" When invoked via a \fBgzip\fR symlink, \fBzstd\fR will support further options that intend to mimic the \fBgzip\fR behavior: -. .TP \fB\-n\fR, \fB\-\-no\-name\fR do not store the original filename and timestamps when compressing a file\. This is the default behavior and hence a no\-op\. -. .TP \fB\-\-best\fR alias to the option \fB\-9\fR\. -. .SS "Environment Variables" Employing environment variables to set parameters has security implications\. Therefore, this avenue is intentionally limited\. Only \fBZSTD_CLEVEL\fR and \fBZSTD_NBTHREADS\fR are currently supported\. They set the compression level and number of threads to use during compression, respectively\. -. .P \fBZSTD_CLEVEL\fR can be used to set the level between 1 and 19 (the "normal" range)\. If the value of \fBZSTD_CLEVEL\fR is not a valid integer, it will be ignored with a warning message\. \fBZSTD_CLEVEL\fR just replaces the default compression level (\fB3\fR)\. -. .P \fBZSTD_NBTHREADS\fR can be used to set the number of threads \fBzstd\fR will attempt to use during compression\. If the value of \fBZSTD_NBTHREADS\fR is not a valid unsigned integer, it will be ignored with a warning message\. \fBZSTD_NBTHREADS\fR has a default value of (\fB1\fR), and is capped at ZSTDMT_NBWORKERS_MAX==200\. \fBzstd\fR must be compiled with multithread support for this to have any effect\. -. .P They can both be overridden by corresponding command line arguments: \fB\-#\fR for compression level and \fB\-T#\fR for number of compression threads\. -. .SH "DICTIONARY BUILDER" \fBzstd\fR offers \fIdictionary\fR compression, which greatly improves efficiency on small files and messages\. It\'s possible to train \fBzstd\fR with a set of samples, the result of which is saved into a file called a \fBdictionary\fR\. Then, during compression and decompression, reference the same dictionary, using command \fB\-D dictionaryFileName\fR\. Compression of small files similar to the sample set will be greatly improved\. -. .TP \fB\-\-train FILEs\fR Use FILEs as training set to create a dictionary\. The training set should ideally contain a lot of samples (> 100), and weight typically 100x the target dictionary size (for example, ~10 MB for a 100 KB dictionary)\. \fB\-\-train\fR can be combined with \fB\-r\fR to indicate a directory rather than listing all the files, which can be useful to circumvent shell expansion limits\. -. .IP Since dictionary compression is mostly effective for small files, the expectation is that the training set will only contain small files\. In the case where some samples happen to be large, only the first 128 KiB of these samples will be used for training\. -. .IP \fB\-\-train\fR supports multithreading if \fBzstd\fR is compiled with threading support (default)\. Additional advanced parameters can be specified with \fB\-\-train\-fastcover\fR\. The legacy dictionary builder can be accessed with \fB\-\-train\-legacy\fR\. The slower cover dictionary builder can be accessed with \fB\-\-train\-cover\fR\. Default \fB\-\-train\fR is equivalent to \fB\-\-train\-fastcover=d=8,steps=4\fR\. -. .TP \fB\-o FILE\fR Dictionary saved into \fBFILE\fR (default name: dictionary)\. -. .TP \fB\-\-maxdict=#\fR Limit dictionary to specified size (default: 112640 bytes)\. As usual, quantities are expressed in bytes by default, and it\'s possible to employ suffixes (like \fBKB\fR or \fBMB\fR) to specify larger values\. -. .TP \fB\-#\fR Use \fB#\fR compression level during training (optional)\. Will generate statistics more tuned for selected compression level, resulting in a \fIsmall\fR compression ratio improvement for this level\. -. .TP \fB\-B#\fR Split input files into blocks of size # (default: no split) -. .TP \fB\-M#\fR, \fB\-\-memory=#\fR Limit the amount of sample data loaded for training (default: 2 GB)\. Note that the default (2 GB) is also the maximum\. This parameter can be useful in situations where the training set size is not well controlled and could be potentially very large\. Since speed of the training process is directly correlated to the size of the training sample set, a smaller sample set leads to faster training\. -. .IP In situations where the training set is larger than maximum memory, the CLI will randomly select samples among the available ones, up to the maximum allowed memory budget\. This is meant to improve dictionary relevance by mitigating the potential impact of clustering, such as selecting only files from the beginning of a list sorted by modification date, or sorted by alphabetical order\. The randomization process is deterministic, so training of the same list of files with the same parameters will lead to the creation of the same dictionary\. -. .TP \fB\-\-dictID=#\fR A dictionary ID is a locally unique ID\. The decoder will use this value to verify it is using the right dictionary\. By default, zstd will create a 4\-bytes random number ID\. It\'s possible to provide an explicit number ID instead\. It\'s up to the dictionary manager to not assign twice the same ID to 2 different dictionaries\. Note that short numbers have an advantage: an ID < 256 will only need 1 byte in the compressed frame header, and an ID < 65536 will only need 2 bytes\. This compares favorably to 4 bytes default\. -. .IP -Note that RFC8878 reserves IDs less than 32768 and greater than or equal to 2^31, so they should not be used in public\. -. +Note that RFC8878 reserves IDs less than 32768 and greater than or equal to 2\e^31, so they should not be used in public\. .TP \fB\-\-train\-cover[=k#,d=#,steps=#,split=#,shrink[=#]]\fR Select parameters for the default dictionary builder algorithm named cover\. If \fId\fR is not specified, then it tries \fId\fR = 6 and \fId\fR = 8\. If \fIk\fR is not specified, then it tries \fIsteps\fR values in the range [50, 2000]\. If \fIsteps\fR is not specified, then the default value of 40 is used\. If \fIsplit\fR is not specified or split <= 0, then the default value of 100 is used\. Requires that \fId\fR <= \fIk\fR\. If \fIshrink\fR flag is not used, then the default value for \fIshrinkDict\fR of 0 is used\. If \fIshrink\fR is not specified, then the default value for \fIshrinkDictMaxRegression\fR of 1 is used\. -. .IP Selects segments of size \fIk\fR with highest score to put in the dictionary\. The score of a segment is computed by the sum of the frequencies of all the subsegments of size \fId\fR\. Generally \fId\fR should be in the range [6, 8], occasionally up to 16, but the algorithm will run faster with d <= \fI8\fR\. Good values for \fIk\fR vary widely based on the input data, but a safe range is [2 * \fId\fR, 2000]\. If \fIsplit\fR is 100, all input samples are used for both training and testing to find optimal \fId\fR and \fIk\fR to build dictionary\. Supports multithreading if \fBzstd\fR is compiled with threading support\. Having \fIshrink\fR enabled takes a truncated dictionary of minimum size and doubles in size until compression ratio of the truncated dictionary is at most \fIshrinkDictMaxRegression%\fR worse than the compression ratio of the largest dictionary\. -. .IP Examples: -. .IP \fBzstd \-\-train\-cover FILEs\fR -. .IP \fBzstd \-\-train\-cover=k=50,d=8 FILEs\fR -. .IP \fBzstd \-\-train\-cover=d=8,steps=500 FILEs\fR -. .IP \fBzstd \-\-train\-cover=k=50 FILEs\fR -. .IP \fBzstd \-\-train\-cover=k=50,split=60 FILEs\fR -. .IP \fBzstd \-\-train\-cover=shrink FILEs\fR -. .IP \fBzstd \-\-train\-cover=shrink=2 FILEs\fR -. .TP \fB\-\-train\-fastcover[=k#,d=#,f=#,steps=#,split=#,accel=#]\fR Same as cover but with extra parameters \fIf\fR and \fIaccel\fR and different default value of split If \fIsplit\fR is not specified, then it tries \fIsplit\fR = 75\. If \fIf\fR is not specified, then it tries \fIf\fR = 20\. Requires that 0 < \fIf\fR < 32\. If \fIaccel\fR is not specified, then it tries \fIaccel\fR = 1\. Requires that 0 < \fIaccel\fR <= 10\. Requires that \fId\fR = 6 or \fId\fR = 8\. -. .IP \fIf\fR is log of size of array that keeps track of frequency of subsegments of size \fId\fR\. The subsegment is hashed to an index in the range [0,2^\fIf\fR \- 1]\. It is possible that 2 different subsegments are hashed to the same index, and they are considered as the same subsegment when computing frequency\. Using a higher \fIf\fR reduces collision but takes longer\. -. .IP Examples: -. .IP \fBzstd \-\-train\-fastcover FILEs\fR -. .IP \fBzstd \-\-train\-fastcover=d=8,f=15,accel=2 FILEs\fR -. .TP \fB\-\-train\-legacy[=selectivity=#]\fR Use legacy dictionary builder algorithm with the given dictionary \fIselectivity\fR (default: 9)\. The smaller the \fIselectivity\fR value, the denser the dictionary, improving its efficiency but reducing its achievable maximum size\. \fB\-\-train\-legacy=s=#\fR is also accepted\. -. .IP Examples: -. .IP \fBzstd \-\-train\-legacy FILEs\fR -. .IP \fBzstd \-\-train\-legacy=selectivity=8 FILEs\fR -. .SH "BENCHMARK" -. .TP \fB\-b#\fR benchmark file(s) using compression level # -. .TP \fB\-e#\fR benchmark file(s) using multiple compression levels, from \fB\-b#\fR to \fB\-e#\fR (inclusive) -. .TP \fB\-i#\fR minimum evaluation time, in seconds (default: 3s), benchmark mode only -. .TP \fB\-B#\fR, \fB\-\-block\-size=#\fR cut file(s) into independent chunks of size # (default: no chunking) -. .TP \fB\-\-priority=rt\fR set process priority to real\-time -. .P \fBOutput Format:\fR CompressionLevel#Filename: InputSize \-> OutputSize (CompressionRatio), CompressionSpeed, DecompressionSpeed -. .P \fBMethodology:\fR For both compression and decompression speed, the entire input is compressed/decompressed in\-memory to measure speed\. A run lasts at least 1 sec, so when files are small, they are compressed/decompressed several times per run, in order to improve measurement accuracy\. -. .SH "ADVANCED COMPRESSION OPTIONS" -. -.SS "\-B#:" -Specify the size of each compression job\. This parameter is only available when multi\-threading is enabled\. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads\. Default job size varies depending on compression level (generally \fB4 * windowSize\fR)\. \fB\-B#\fR makes it possible to manually select a custom size\. Note that job size must respect a minimum value which is enforced transparently\. This minimum is either 512 KB, or \fBoverlapSize\fR, whichever is largest\. Different job sizes will lead to non\-identical compressed frames\. -. +### \-B#: Specify the size of each compression job\. This parameter is only available when multi\-threading is enabled\. Each compression job is run in parallel, so this value indirectly impacts the nb of active threads\. Default job size varies depending on compression level (generally \fB4 * windowSize\fR)\. \fB\-B#\fR makes it possible to manually select a custom size\. Note that job size must respect a minimum value which is enforced transparently\. This minimum is either 512 KB, or \fBoverlapSize\fR, whichever is largest\. Different job sizes will lead to non\-identical compressed frames\. .SS "\-\-zstd[=options]:" \fBzstd\fR provides 22 predefined regular compression levels plus the fast levels\. This compression level is translated internally into a number of specific parameters that actually control the behavior of the compressor\. (You can see the result of this translation with \fB\-\-show\-default\-cparams\fR\.) These specific parameters can be overridden with advanced compression options\. The \fIoptions\fR are provided as a comma\-separated list\. You may specify only the options you want to change and the rest will be taken from the selected or default compression level\. The list of available \fIoptions\fR: -. .TP \fBstrategy\fR=\fIstrat\fR, \fBstrat\fR=\fIstrat\fR Specify a strategy used by a match finder\. -. .IP There are 9 strategies numbered from 1 to 9, from fastest to strongest: 1=\fBZSTD_fast\fR, 2=\fBZSTD_dfast\fR, 3=\fBZSTD_greedy\fR, 4=\fBZSTD_lazy\fR, 5=\fBZSTD_lazy2\fR, 6=\fBZSTD_btlazy2\fR, 7=\fBZSTD_btopt\fR, 8=\fBZSTD_btultra\fR, 9=\fBZSTD_btultra2\fR\. -. .TP \fBwindowLog\fR=\fIwlog\fR, \fBwlog\fR=\fIwlog\fR Specify the maximum number of bits for a match distance\. -. .IP The higher number of increases the chance to find a match which usually improves compression ratio\. It also increases memory requirements for the compressor and decompressor\. The minimum \fIwlog\fR is 10 (1 KiB) and the maximum is 30 (1 GiB) on 32\-bit platforms and 31 (2 GiB) on 64\-bit platforms\. -. .IP Note: If \fBwindowLog\fR is set to larger than 27, \fB\-\-long=windowLog\fR or \fB\-\-memory=windowSize\fR needs to be passed to the decompressor\. -. .TP \fBhashLog\fR=\fIhlog\fR, \fBhlog\fR=\fIhlog\fR Specify the maximum number of bits for a hash table\. -. .IP Bigger hash tables cause fewer collisions which usually makes compression faster, but requires more memory during compression\. -. .IP The minimum \fIhlog\fR is 6 (64 entries / 256 B) and the maximum is 30 (1B entries / 4 GiB)\. -. .TP \fBchainLog\fR=\fIclog\fR, \fBclog\fR=\fIclog\fR Specify the maximum number of bits for the secondary search structure, whose form depends on the selected \fBstrategy\fR\. -. .IP Higher numbers of bits increases the chance to find a match which usually improves compression ratio\. It also slows down compression speed and increases memory requirements for compression\. This option is ignored for the \fBZSTD_fast\fR \fBstrategy\fR, which only has the primary hash table\. -. .IP The minimum \fIclog\fR is 6 (64 entries / 256 B) and the maximum is 29 (512M entries / 2 GiB) on 32\-bit platforms and 30 (1B entries / 4 GiB) on 64\-bit platforms\. -. .TP \fBsearchLog\fR=\fIslog\fR, \fBslog\fR=\fIslog\fR Specify the maximum number of searches in a hash chain or a binary tree using logarithmic scale\. -. .IP More searches increases the chance to find a match which usually increases compression ratio but decreases compression speed\. -. .IP The minimum \fIslog\fR is 1 and the maximum is \'windowLog\' \- 1\. -. .TP \fBminMatch\fR=\fImml\fR, \fBmml\fR=\fImml\fR Specify the minimum searched length of a match in a hash table\. -. .IP Larger search lengths usually decrease compression ratio but improve decompression speed\. -. .IP The minimum \fImml\fR is 3 and the maximum is 7\. -. .TP \fBtargetLength\fR=\fItlen\fR, \fBtlen\fR=\fItlen\fR The impact of this field vary depending on selected strategy\. -. .IP For \fBZSTD_btopt\fR, \fBZSTD_btultra\fR and \fBZSTD_btultra2\fR, it specifies the minimum match length that causes match finder to stop searching\. A larger \fBtargetLength\fR usually improves compression ratio but decreases compression speed\. -. .IP For \fBZSTD_fast\fR, it triggers ultra\-fast mode when > 0\. The value represents the amount of data skipped between match sampling\. Impact is reversed: a larger \fBtargetLength\fR increases compression speed but decreases compression ratio\. -. .IP For all other strategies, this field has no impact\. -. .IP The minimum \fItlen\fR is 0 and the maximum is 128 KiB\. -. .TP \fBoverlapLog\fR=\fIovlog\fR, \fBovlog\fR=\fIovlog\fR Determine \fBoverlapSize\fR, amount of data reloaded from previous job\. This parameter is only available when multithreading is enabled\. Reloading more data improves compression ratio, but decreases speed\. -. .IP The minimum \fIovlog\fR is 0, and the maximum is 9\. 1 means "no overlap", hence completely independent jobs\. 9 means "full overlap", meaning up to \fBwindowSize\fR is reloaded from previous job\. Reducing \fIovlog\fR by 1 reduces the reloaded amount by a factor 2\. For example, 8 means "windowSize/2", and 6 means "windowSize/8"\. Value 0 is special and means "default": \fIovlog\fR is automatically determined by \fBzstd\fR\. In which case, \fIovlog\fR will range from 6 to 9, depending on selected \fIstrat\fR\. -. .TP \fBldmHashLog\fR=\fIlhlog\fR, \fBlhlog\fR=\fIlhlog\fR Specify the maximum size for a hash table used for long distance matching\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Bigger hash tables usually improve compression ratio at the expense of more memory during compression and a decrease in compression speed\. -. .IP The minimum \fIlhlog\fR is 6 and the maximum is 30 (default: 20)\. -. .TP \fBldmMinMatch\fR=\fIlmml\fR, \fBlmml\fR=\fIlmml\fR Specify the minimum searched length of a match for long distance matching\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Larger/very small values usually decrease compression ratio\. -. .IP The minimum \fIlmml\fR is 4 and the maximum is 4096 (default: 64)\. -. .TP \fBldmBucketSizeLog\fR=\fIlblog\fR, \fBlblog\fR=\fIlblog\fR Specify the size of each bucket for the hash table used for long distance matching\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Larger bucket sizes improve collision resolution but decrease compression speed\. -. .IP The minimum \fIlblog\fR is 1 and the maximum is 8 (default: 3)\. -. .TP \fBldmHashRateLog\fR=\fIlhrlog\fR, \fBlhrlog\fR=\fIlhrlog\fR Specify the frequency of inserting entries into the long distance matching hash table\. -. .IP This option is ignored unless long distance matching is enabled\. -. .IP Larger values will improve compression speed\. Deviating far from the default value will likely result in a decrease in compression ratio\. -. .IP The default value is \fBwlog \- lhlog\fR\. -. .SS "Example" The following parameters sets advanced compression options to something similar to predefined level 19 for files bigger than 256 KB: -. .P \fB\-\-zstd\fR=wlog=23,clog=23,hlog=22,slog=6,mml=3,tlen=48,strat=6 -. .SH "SEE ALSO" \fBzstdgrep\fR(1), \fBzstdless\fR(1), \fBgzip\fR(1), \fBxz\fR(1) -. .P The \fIzstandard\fR format is specified in Y\. Collet, "Zstandard Compression and the \'application/zstd\' Media Type", https://www\.ietf\.org/rfc/rfc8878\.txt, Internet RFC 8878 (February 2021)\. -. .SH "BUGS" Report bugs at: https://github\.com/facebook/zstd/issues -. .SH "AUTHOR" Yann Collet diff --git a/programs/zstdgrep.1 b/programs/zstdgrep.1 index 8c7cf5eda..77d29b4bf 100644 --- a/programs/zstdgrep.1 +++ b/programs/zstdgrep.1 @@ -1,26 +1,17 @@ -. -.TH "ZSTDGREP" "1" "August 2022" "zstd 1.5.3" "User Commands" -. +.TH "ZSTDGREP" "1" "February 2023" "zstd 1.5.4" "User Commands" .SH "NAME" \fBzstdgrep\fR \- print lines matching a pattern in zstandard\-compressed files -. .SH "SYNOPSIS" -\fBzstdgrep\fR [\fIgrep\-flags\fR] [\-\-] \fIpattern\fR [\fIfiles\fR \.\.\.] -. +\fBzstdgrep\fR [\fIgrep\-flags\fR] [\-\-] \fIpattern\fR [\fIfiles\fR \|\.\|\.\|\.] .SH "DESCRIPTION" -\fBzstdgrep\fR runs \fBgrep (1)\fR on files, or \fBstdin\fR if no files argument is given, after decompressing them with \fBzstdcat (1)\fR\. -. +\fBzstdgrep\fR runs \fBgrep\fR(1) on files, or \fBstdin\fR if no files argument is given, after decompressing them with \fBzstdcat\fR(1)\. .P -The grep\-flags and pattern arguments are passed on to \fBgrep (1)\fR\. If an \fB\-e\fR flag is found in the \fBgrep\-flags\fR, \fBzstdgrep\fR will not look for a pattern argument\. -. +The \fIgrep\-flags\fR and \fIpattern\fR arguments are passed on to \fBgrep\fR(1)\. If an \fB\-e\fR flag is found in the \fIgrep\-flags\fR, \fBzstdgrep\fR will not look for a \fIpattern\fR argument\. .P -Note that modern \fBgrep\fR alternatives such as \fBripgrep\fR (\fBrg\fR) support \fBzstd\fR\-compressed files out of the box, and can prove better alternatives than \fBzstdgrep\fR notably for unsupported complex pattern searches\. Note though that such alternatives may also feature some minor command line differences\. -. +Note that modern \fBgrep\fR alternatives such as \fBripgrep\fR (\fBrg\fR(1)) support \fBzstd\fR\-compressed files out of the box, and can prove better alternatives than \fBzstdgrep\fR notably for unsupported complex pattern searches\. Note though that such alternatives may also feature some minor command line differences\. .SH "EXIT STATUS" In case of missing arguments or missing pattern, 1 will be returned, otherwise 0\. -. .SH "SEE ALSO" -\fBzstd (1)\fR -. +\fBzstd\fR(1) .SH "AUTHORS" Thomas Klausner \fIwiz@NetBSD\.org\fR diff --git a/programs/zstdless.1 b/programs/zstdless.1 index a1414946e..6c82b9c9e 100644 --- a/programs/zstdless.1 +++ b/programs/zstdless.1 @@ -1,14 +1,9 @@ -. -.TH "ZSTDLESS" "1" "August 2022" "zstd 1.5.3" "User Commands" -. +.TH "ZSTDLESS" "1" "February 2023" "zstd 1.5.4" "User Commands" .SH "NAME" \fBzstdless\fR \- view zstandard\-compressed files -. .SH "SYNOPSIS" -\fBzstdless\fR [\fIflags\fR] [\fIfile\fR \.\.\.] -. +\fBzstdless\fR [\fIflags\fR] [\fIfile\fR \|\.\|\.\|\.] .SH "DESCRIPTION" -\fBzstdless\fR runs \fBless (1)\fR on files or stdin, if no files argument is given, after decompressing them with \fBzstdcat (1)\fR\. -. +\fBzstdless\fR runs \fBless\fR(1) on files or stdin, if no \fIfile\fR argument is given, after decompressing them with \fBzstdcat\fR(1)\. .SH "SEE ALSO" -\fBzstd (1)\fR +\fBzstd\fR(1) From 515266e31b2369f82594d47ff4666f0612382bb7 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 9 Feb 2023 15:51:18 -0800 Subject: [PATCH 472/472] minor nit updates to README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d34bda576..6bcf757d8 100644 --- a/README.md +++ b/README.md @@ -191,13 +191,15 @@ The output binary will be in `buck-out/gen/programs/`. ## Testing -You can run quick local smoke tests by executing the `playTest.sh` script from the `src/tests` directory. -Two env variables `$ZSTD_BIN` and `$DATAGEN_BIN` are needed for the test script to locate the zstd and datagen binary. -For information on CI testing, please refer to TESTING.md +You can run quick local smoke tests by running `make check`. +If you can't use `make`, execute the `playTest.sh` script from the `src/tests` directory. +Two env variables `$ZSTD_BIN` and `$DATAGEN_BIN` are needed for the test script to locate the `zstd` and `datagen` binary. +For information on CI testing, please refer to `TESTING.md`. ## Status -Zstandard is currently deployed within Facebook. It is used continuously to compress large amounts of data in multiple formats and use cases. +Zstandard is currently deployed within Facebook and many other large cloud infrastructures. +It is run continuously to compress large amounts of data in multiple formats and use cases. Zstandard is considered safe for production environments. ## License