]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Resolved merge conflict dev+zstdmt
authorYann Collet <cyan@fb.com>
Sat, 21 Jan 2017 00:44:50 +0000 (16:44 -0800)
committerYann Collet <cyan@fb.com>
Sat, 21 Jan 2017 00:44:50 +0000 (16:44 -0800)
1  2 
Makefile
build/VS2008/zstd/zstd.vcproj
build/VS2010/zstd/zstd.vcxproj
build/cmake/lib/CMakeLists.txt
lib/Makefile
lib/compress/zstd_compress.c
lib/zstd.h
programs/Makefile
programs/zstdcli.c
tests/Makefile
tests/zstreamtest.c

diff --cc Makefile
Simple merge
Simple merge
Simple merge
index dce39aba1f3cb40098aeda0bbc0906e319968963,34a639cdb008499316c74f66ad12feceb766650e..db752784b54284934a136a7f9dddd58462f9bd99
@@@ -47,9 -64,10 +47,10 @@@ SET(Source
          ${LIBRARY_DIR}/compress/fse_compress.c
          ${LIBRARY_DIR}/compress/huf_compress.c
          ${LIBRARY_DIR}/compress/zstd_compress.c
 +        ${LIBRARY_DIR}/compress/zstdmt_compress.c
          ${LIBRARY_DIR}/decompress/huf_decompress.c
          ${LIBRARY_DIR}/decompress/zstd_decompress.c
+         ${LIBRARY_DIR}/dictBuilder/cover.c
          ${LIBRARY_DIR}/dictBuilder/divsufsort.c
          ${LIBRARY_DIR}/dictBuilder/zdict.c
          ${LIBRARY_DIR}/deprecated/zbuff_common.c
diff --cc lib/Makefile
Simple merge
Simple merge
diff --cc lib/zstd.h
Simple merge
index f2a0ff26e5997d4828683238d12bea6010990c72,a4c149a071208f0be537448e2e8491206c339081..4392939ddeb4159c09f42d239488d214618b9ea2
@@@ -1,7 -1,9 +1,9 @@@
  # ##########################################################################
 -# Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
 +# Copyright (c) 2015-present, Yann Collet, Facebook, Inc.
  # All rights reserved.
  #
+ # This Makefile is validated for Linux, macOS, *BSD, Hurd, Solaris, MSYS2 targets
+ #
  # This source code is licensed under the BSD-style license found in the
  # LICENSE file in the root directory of this source tree. An additional grant
  # of patent rights can be found in the PATENTS file in the same directory.
Simple merge
diff --cc tests/Makefile
index bbc8d3de1009e5dbe8d395e5831f93b3a4fc1dcc,15fdc77f9f6b04fe4870d17598b6c8940e5f4aa7..937f3b41e3ecd9bd60aca08a0bb7796dfcda755f
@@@ -121,11 -121,11 +123,11 @@@ zbufftest-dll : $(ZSTDDIR)/common/xxhas
        $(MAKE) -C $(ZSTDDIR) libzstd
        $(CC) $(CPPFLAGS) $(CFLAGS) $^ $(LDFLAGS) -o $@$(EXT)
  
- zstreamtest  : $(ZSTD_FILES) $(PRGDIR)/datagen.c zstreamtest.c
+ zstreamtest  : $(ZSTD_FILES) $(ZDICT_FILES) $(PRGDIR)/datagen.c zstreamtest.c
 -      $(CC)      $(FLAGS) $^ -o $@$(EXT)
 +      $(CC)      $(FLAGS) $(MULTITHREAD) $^ -o $@$(EXT)
  
- zstreamtest32 : $(ZSTD_FILES) $(PRGDIR)/datagen.c zstreamtest.c
+ zstreamtest32 : $(ZSTD_FILES) $(ZDICT_FILES) $(PRGDIR)/datagen.c zstreamtest.c
 -      $(CC) -m32  $(FLAGS) $^ -o $@$(EXT)
 +      $(CC) -m32  $(FLAGS) $(MULTITHREAD) $^ -o $@$(EXT)
  
  zstreamtest-dll : LDFLAGS+= -L$(ZSTDDIR) -lzstd
  zstreamtest-dll : $(ZSTDDIR)/common/xxhash.c $(PRGDIR)/datagen.c zstreamtest.c
index 1feec450b4db6df06734a5d09c1dfb2faf144a6b,4024e5eda21f17ca3606d82b02aa97b6596923c2..9efba323c2ae6dc48abd8c153ffd1191a04735cc
  #include <time.h>         /* clock_t, clock() */
  #include <string.h>       /* strcmp */
  #include "mem.h"
- #define ZSTD_STATIC_LINKING_ONLY   /* ZSTD_maxCLevel, ZSTD_customMem */
+ #define ZSTD_STATIC_LINKING_ONLY   /* ZSTD_maxCLevel, ZSTD_customMem, ZSTD_getDictID_fromFrame */
  #include "zstd.h"         /* ZSTD_compressBound */
  #include "zstd_errors.h"  /* ZSTD_error_srcSize_wrong */
 +#include "zstdmt_compress.h"
+ #include "zdict.h"        /* ZDICT_trainFromBuffer */
  #include "datagen.h"      /* RDG_genBuffer */
  #define XXH_STATIC_LINKING_ONLY   /* XXH64_state_t */
  #include "xxhash.h"       /* XXH64_* */
@@@ -315,11 -361,11 +362,11 @@@ static int basicUnitTests(U32 seed, dou
          { size_t const r = ZSTD_endStream(zc, &outBuff);
              if (r != 0) goto _output_error; }  /* error, or some data not flushed */
      }
 -    DISPLAYLEVEL(4, "OK \n");
 +    DISPLAYLEVEL(3, "OK \n");
  
      /* CDict scenario */
 -    DISPLAYLEVEL(4, "test%3i : digested dictionary : ", testNb++);
 +    DISPLAYLEVEL(3, "test%3i : digested dictionary : ", testNb++);
-     {   ZSTD_CDict* const cdict = ZSTD_createCDict(CNBuffer, 128 KB, 1);
+     {   ZSTD_CDict* const cdict = ZSTD_createCDict(dictionary.start, dictionary.filled, 1);
          size_t const initError = ZSTD_initCStream_usingCDict(zc, cdict);
          if (ZSTD_isError(initError)) goto _output_error;
          cSize = 0;
            if (r != 0) goto _output_error; }  /* error, or some data not flushed */
          cSize = outBuff.pos;
          ZSTD_freeCDict(cdict);
 -        DISPLAYLEVEL(4, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/CNBufferSize*100);
 +        DISPLAYLEVEL(3, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/CNBufferSize*100);
      }
  
 -    DISPLAYLEVEL(4, "test%3i : check CStream size : ", testNb++);
 +    DISPLAYLEVEL(3, "test%3i : check CStream size : ", testNb++);
      { size_t const s = ZSTD_sizeof_CStream(zc);
        if (ZSTD_isError(s)) goto _output_error;
 -      DISPLAYLEVEL(4, "OK (%u bytes) \n", (U32)s);
 +      DISPLAYLEVEL(3, "OK (%u bytes) \n", (U32)s);
      }
  
+     DISPLAYLEVEL(4, "test%3i : check Dictionary ID : ", testNb++);
+     { unsigned const dID = ZSTD_getDictID_fromFrame(compressedBuffer, cSize);
+       if (dID != dictID) goto _output_error;
+       DISPLAYLEVEL(4, "OK (%u) \n", dID);
+     }
      /* DDict scenario */
 -    DISPLAYLEVEL(4, "test%3i : decompress %u bytes with digested dictionary : ", testNb++, (U32)CNBufferSize);
 +    DISPLAYLEVEL(3, "test%3i : decompress %u bytes with digested dictionary : ", testNb++, (U32)CNBufferSize);
-     {   ZSTD_DDict* const ddict = ZSTD_createDDict(CNBuffer, 128 KB);
+     {   ZSTD_DDict* const ddict = ZSTD_createDDict(dictionary.start, dictionary.filled);
          size_t const initError = ZSTD_initDStream_usingDDict(zd, ddict);
          if (ZSTD_isError(initError)) goto _output_error;
          inBuff.src = compressedBuffer;
@@@ -660,249 -712,6 +714,249 @@@ _output_error
  }
  
  
-         lseed = coreSeed ^ prime1;
 +/* Multi-threading version of fuzzer Tests */
 +static int fuzzerTests_MT(U32 seed, U32 nbTests, unsigned startTest, double compressibility)
 +{
 +    static const U32 maxSrcLog = 24;
 +    static const U32 maxSampleLog = 19;
 +    size_t const srcBufferSize = (size_t)1<<maxSrcLog;
 +    BYTE* cNoiseBuffer[5];
 +    size_t const copyBufferSize= srcBufferSize + (1<<maxSampleLog);
 +    BYTE*  const copyBuffer = (BYTE*)malloc (copyBufferSize);
 +    size_t const cBufferSize   = ZSTD_compressBound(srcBufferSize);
 +    BYTE*  const cBuffer = (BYTE*)malloc (cBufferSize);
 +    size_t const dstBufferSize = srcBufferSize;
 +    BYTE*  const dstBuffer = (BYTE*)malloc (dstBufferSize);
 +    U32 result = 0;
 +    U32 testNb = 0;
 +    U32 coreSeed = seed;
 +    ZSTDMT_CCtx* zc = ZSTDMT_createCCtx(2);   /* will be reset sometimes */
 +    ZSTD_DStream* zd = ZSTD_createDStream();   /* will be reset sometimes */
 +    ZSTD_DStream* const zd_noise = ZSTD_createDStream();
 +    clock_t const startClock = clock();
 +    const BYTE* dict=NULL;   /* can keep same dict on 2 consecutive tests */
 +    size_t dictSize = 0;
 +    U32 oldTestLog = 0;
 +
 +    /* allocations */
 +    cNoiseBuffer[0] = (BYTE*)malloc (srcBufferSize);
 +    cNoiseBuffer[1] = (BYTE*)malloc (srcBufferSize);
 +    cNoiseBuffer[2] = (BYTE*)malloc (srcBufferSize);
 +    cNoiseBuffer[3] = (BYTE*)malloc (srcBufferSize);
 +    cNoiseBuffer[4] = (BYTE*)malloc (srcBufferSize);
 +    CHECK (!cNoiseBuffer[0] || !cNoiseBuffer[1] || !cNoiseBuffer[2] || !cNoiseBuffer[3] || !cNoiseBuffer[4] ||
 +           !copyBuffer || !dstBuffer || !cBuffer || !zc || !zd || !zd_noise ,
 +           "Not enough memory, fuzzer tests cancelled");
 +
 +    /* Create initial samples */
 +    RDG_genBuffer(cNoiseBuffer[0], srcBufferSize, 0.00, 0., coreSeed);    /* pure noise */
 +    RDG_genBuffer(cNoiseBuffer[1], srcBufferSize, 0.05, 0., coreSeed);    /* barely compressible */
 +    RDG_genBuffer(cNoiseBuffer[2], srcBufferSize, compressibility, 0., coreSeed);
 +    RDG_genBuffer(cNoiseBuffer[3], srcBufferSize, 0.95, 0., coreSeed);    /* highly compressible */
 +    RDG_genBuffer(cNoiseBuffer[4], srcBufferSize, 1.00, 0., coreSeed);    /* sparse content */
 +    memset(copyBuffer, 0x65, copyBufferSize);                             /* make copyBuffer considered initialized */
 +    ZSTD_initDStream_usingDict(zd, NULL, 0);  /* ensure at least one init */
 +
 +    /* catch up testNb */
 +    for (testNb=1; testNb < startTest; testNb++)
 +        FUZ_rand(&coreSeed);
 +
 +    /* test loop */
 +    for ( ; (testNb <= nbTests) || (FUZ_GetClockSpan(startClock) < g_clockTime) ; testNb++ ) {
 +        U32 lseed;
 +        const BYTE* srcBuffer;
 +        size_t totalTestSize, totalGenSize, cSize;
 +        XXH64_state_t xxhState;
 +        U64 crcOrig;
 +        U32 resetAllowed = 1;
 +        size_t maxTestSize;
 +
 +        /* init */
 +        if (nbTests >= testNb) { DISPLAYUPDATE(2, "\r%6u/%6u    ", testNb, nbTests); }
 +        else { DISPLAYUPDATE(2, "\r%6u          ", testNb); }
 +        FUZ_rand(&coreSeed);
++        lseed = coreSeed ^ prime32;
 +
 +        /* states full reset (deliberately not synchronized) */
 +        /* some issues can only happen when reusing states */
 +        if ((FUZ_rand(&lseed) & 0xFF) == 131) {
 +            U32 const nbThreads = (FUZ_rand(&lseed) % 6) + 1;
 +            ZSTDMT_freeCCtx(zc);
 +            zc = ZSTDMT_createCCtx(nbThreads);
 +            resetAllowed=0;
 +        }
 +        if ((FUZ_rand(&lseed) & 0xFF) == 132) {
 +            ZSTD_freeDStream(zd);
 +            zd = ZSTD_createDStream();
 +            ZSTD_initDStream_usingDict(zd, NULL, 0);  /* ensure at least one init */
 +        }
 +
 +        /* srcBuffer selection [0-4] */
 +        {   U32 buffNb = FUZ_rand(&lseed) & 0x7F;
 +            if (buffNb & 7) buffNb=2;   /* most common : compressible (P) */
 +            else {
 +                buffNb >>= 3;
 +                if (buffNb & 7) {
 +                    const U32 tnb[2] = { 1, 3 };   /* barely/highly compressible */
 +                    buffNb = tnb[buffNb >> 3];
 +                } else {
 +                    const U32 tnb[2] = { 0, 4 };   /* not compressible / sparse */
 +                    buffNb = tnb[buffNb >> 3];
 +            }   }
 +            srcBuffer = cNoiseBuffer[buffNb];
 +        }
 +
 +        /* compression init */
 +        if ((FUZ_rand(&lseed)&1) /* at beginning, to keep same nb of rand */
 +            && oldTestLog /* at least one test happened */ && resetAllowed) {
 +            maxTestSize = FUZ_randomLength(&lseed, oldTestLog+2);
 +            if (maxTestSize >= srcBufferSize) maxTestSize = srcBufferSize-1;
 +            {   int const compressionLevel = (FUZ_rand(&lseed) % 5) + 1;
 +                size_t const resetError = ZSTDMT_initCStream(zc, compressionLevel);
 +                CHECK(ZSTD_isError(resetError), "ZSTDMT_initCStream error : %s", ZSTD_getErrorName(resetError));
 +            }
 +        } else {
 +            U32 const testLog = FUZ_rand(&lseed) % maxSrcLog;
 +            U32 const cLevel = (FUZ_rand(&lseed) % (ZSTD_maxCLevel() - (testLog/3))) + 1;
 +            maxTestSize = FUZ_rLogLength(&lseed, testLog);
 +            oldTestLog = testLog;
 +            /* random dictionary selection */
 +            dictSize  = ((FUZ_rand(&lseed)&63)==1) ? FUZ_randomLength(&lseed, maxSampleLog) : 0;
 +            {   size_t const dictStart = FUZ_rand(&lseed) % (srcBufferSize - dictSize);
 +                dict = srcBuffer + dictStart;
 +            }
 +            {   U64 const pledgedSrcSize = (FUZ_rand(&lseed) & 3) ? 0 : maxTestSize;
 +                ZSTD_parameters params = ZSTD_getParams(cLevel, pledgedSrcSize, dictSize);
 +                DISPLAYLEVEL(5, "Init with windowLog = %u \n", params.cParams.windowLog);
 +                params.fParams.checksumFlag = FUZ_rand(&lseed) & 1;
 +                params.fParams.noDictIDFlag = FUZ_rand(&lseed) & 1;
 +                {   size_t const initError = ZSTDMT_initCStream_advanced(zc, dict, dictSize, params, pledgedSrcSize);
 +                    CHECK (ZSTD_isError(initError),"ZSTDMT_initCStream_advanced error : %s", ZSTD_getErrorName(initError));
 +        }   }   }
 +
 +        /* multi-segments compression test */
 +        XXH64_reset(&xxhState, 0);
 +        {   ZSTD_outBuffer outBuff = { cBuffer, cBufferSize, 0 } ;
 +            U32 n;
 +            for (n=0, cSize=0, totalTestSize=0 ; totalTestSize < maxTestSize ; n++) {
 +                /* compress random chunks into randomly sized dst buffers */
 +                {   size_t const randomSrcSize = FUZ_randomLength(&lseed, maxSampleLog);
 +                    size_t const srcSize = MIN (maxTestSize-totalTestSize, randomSrcSize);
 +                    size_t const srcStart = FUZ_rand(&lseed) % (srcBufferSize - srcSize);
 +                    size_t const randomDstSize = FUZ_randomLength(&lseed, maxSampleLog);
 +                    size_t const dstBuffSize = MIN(cBufferSize - cSize, randomDstSize);
 +                    ZSTD_inBuffer inBuff = { srcBuffer+srcStart, srcSize, 0 };
 +                    outBuff.size = outBuff.pos + dstBuffSize;
 +
 +                    DISPLAYLEVEL(5, "Sending %u bytes to compress \n", (U32)srcSize);
 +                    { size_t const compressionError = ZSTDMT_compressStream(zc, &outBuff, &inBuff);
 +                      CHECK (ZSTD_isError(compressionError), "compression error : %s", ZSTD_getErrorName(compressionError)); }
 +                    DISPLAYLEVEL(5, "%u bytes read by ZSTDMT_compressStream \n", (U32)inBuff.pos);
 +
 +                    XXH64_update(&xxhState, srcBuffer+srcStart, inBuff.pos);
 +                    memcpy(copyBuffer+totalTestSize, srcBuffer+srcStart, inBuff.pos);
 +                    totalTestSize += inBuff.pos;
 +                }
 +
 +                /* random flush operation, to mess around */
 +                if ((FUZ_rand(&lseed) & 15) == 0) {
 +                    size_t const randomDstSize = FUZ_randomLength(&lseed, maxSampleLog);
 +                    size_t const adjustedDstSize = MIN(cBufferSize - cSize, randomDstSize);
 +                    outBuff.size = outBuff.pos + adjustedDstSize;
 +                    DISPLAYLEVEL(5, "Flushing into dst buffer of size %u \n", (U32)adjustedDstSize);
 +                    {   size_t const flushError = ZSTDMT_flushStream(zc, &outBuff);
 +                        CHECK (ZSTD_isError(flushError), "flush error : %s", ZSTD_getErrorName(flushError));
 +            }   }   }
 +
 +            /* final frame epilogue */
 +            {   size_t remainingToFlush = (size_t)(-1);
 +                while (remainingToFlush) {
 +                    size_t const randomDstSize = FUZ_randomLength(&lseed, maxSampleLog);
 +                    size_t const adjustedDstSize = MIN(cBufferSize - cSize, randomDstSize);
 +                    outBuff.size = outBuff.pos + adjustedDstSize;
 +                    DISPLAYLEVEL(5, "Ending into dst buffer of size %u \n", (U32)adjustedDstSize);
 +                    remainingToFlush = ZSTDMT_endStream(zc, &outBuff);
 +                    CHECK (ZSTD_isError(remainingToFlush), "flush error : %s", ZSTD_getErrorName(remainingToFlush));
 +                    DISPLAYLEVEL(5, "endStream : remainingToFlush : %u \n", (U32)remainingToFlush);
 +            }   }
 +            DISPLAYLEVEL(5, "Frame completed \n");
 +            crcOrig = XXH64_digest(&xxhState);
 +            cSize = outBuff.pos;
 +        }
 +
 +        /* multi - fragments decompression test */
 +        if (!dictSize /* don't reset if dictionary : could be different */ && (FUZ_rand(&lseed) & 1)) {
 +            CHECK (ZSTD_isError(ZSTD_resetDStream(zd)), "ZSTD_resetDStream failed");
 +        } else {
 +            ZSTD_initDStream_usingDict(zd, dict, dictSize);
 +        }
 +        {   size_t decompressionResult = 1;
 +            ZSTD_inBuffer  inBuff = { cBuffer, cSize, 0 };
 +            ZSTD_outBuffer outBuff= { dstBuffer, dstBufferSize, 0 };
 +            for (totalGenSize = 0 ; decompressionResult ; ) {
 +                size_t const readCSrcSize = FUZ_randomLength(&lseed, maxSampleLog);
 +                size_t const randomDstSize = FUZ_randomLength(&lseed, maxSampleLog);
 +                size_t const dstBuffSize = MIN(dstBufferSize - totalGenSize, randomDstSize);
 +                inBuff.size = inBuff.pos + readCSrcSize;
 +                outBuff.size = inBuff.pos + dstBuffSize;
 +                decompressionResult = ZSTD_decompressStream(zd, &outBuff, &inBuff);
 +                CHECK (ZSTD_isError(decompressionResult), "decompression error : %s", ZSTD_getErrorName(decompressionResult));
 +            }
 +            CHECK (decompressionResult != 0, "frame not fully decoded");
 +            CHECK (outBuff.pos != totalTestSize, "decompressed data : wrong size")
 +            CHECK (inBuff.pos != cSize, "compressed data should be fully read")
 +            {   U64 const crcDest = XXH64(dstBuffer, totalTestSize, 0);
 +                if (crcDest!=crcOrig) findDiff(copyBuffer, dstBuffer, totalTestSize);
 +                CHECK (crcDest!=crcOrig, "decompressed data corrupted");
 +        }   }
 +
 +        /*=====   noisy/erroneous src decompression test   =====*/
 +
 +        /* add some noise */
 +        {   U32 const nbNoiseChunks = (FUZ_rand(&lseed) & 7) + 2;
 +            U32 nn; for (nn=0; nn<nbNoiseChunks; nn++) {
 +                size_t const randomNoiseSize = FUZ_randomLength(&lseed, maxSampleLog);
 +                size_t const noiseSize  = MIN((cSize/3) , randomNoiseSize);
 +                size_t const noiseStart = FUZ_rand(&lseed) % (srcBufferSize - noiseSize);
 +                size_t const cStart = FUZ_rand(&lseed) % (cSize - noiseSize);
 +                memcpy(cBuffer+cStart, srcBuffer+noiseStart, noiseSize);
 +        }   }
 +
 +        /* try decompression on noisy data */
 +        ZSTD_initDStream(zd_noise);   /* note : no dictionary */
 +        {   ZSTD_inBuffer  inBuff = { cBuffer, cSize, 0 };
 +            ZSTD_outBuffer outBuff= { dstBuffer, dstBufferSize, 0 };
 +            while (outBuff.pos < dstBufferSize) {
 +                size_t const randomCSrcSize = FUZ_randomLength(&lseed, maxSampleLog);
 +                size_t const randomDstSize = FUZ_randomLength(&lseed, maxSampleLog);
 +                size_t const adjustedDstSize = MIN(dstBufferSize - outBuff.pos, randomDstSize);
 +                outBuff.size = outBuff.pos + adjustedDstSize;
 +                inBuff.size  = inBuff.pos + randomCSrcSize;
 +                {   size_t const decompressError = ZSTD_decompressStream(zd, &outBuff, &inBuff);
 +                    if (ZSTD_isError(decompressError)) break;   /* error correctly detected */
 +    }   }   }   }
 +    DISPLAY("\r%u fuzzer tests completed   \n", testNb);
 +
 +_cleanup:
 +    ZSTDMT_freeCCtx(zc);
 +    ZSTD_freeDStream(zd);
 +    ZSTD_freeDStream(zd_noise);
 +    free(cNoiseBuffer[0]);
 +    free(cNoiseBuffer[1]);
 +    free(cNoiseBuffer[2]);
 +    free(cNoiseBuffer[3]);
 +    free(cNoiseBuffer[4]);
 +    free(copyBuffer);
 +    free(cBuffer);
 +    free(dstBuffer);
 +    return result;
 +
 +_output_error:
 +    result = 1;
 +    goto _cleanup;
 +}
 +
 +
  /*-*******************************************************
  *  Command line
  *********************************************************/