mirror of
				https://github.com/facebook/zstd.git
				synced 2025-10-31 08:37:43 +02:00 
			
		
		
		
	Merge pull request #958 from facebook/continueCCtx
fix a subtle issue in continue mode
This commit is contained in:
		| @@ -57,20 +57,19 @@ extern "C" { | ||||
| extern int g_debuglog_enable; | ||||
| /* recommended values for ZSTD_DEBUG display levels : | ||||
|  * 1 : no display, enables assert() only | ||||
|  * 2 : reserved for currently active debugging path | ||||
|  * 3 : events once per object lifetime (CCtx, CDict) | ||||
|  * 2 : reserved for currently active debug path | ||||
|  * 3 : events once per object lifetime (CCtx, CDict, etc.) | ||||
|  * 4 : events once per frame | ||||
|  * 5 : events once per block | ||||
|  * 6 : events once per sequence (*very* verbose) */ | ||||
| #  define RAWLOG(l, ...) {                                 \ | ||||
|                 if ((g_debuglog_enable) & (l<=ZSTD_DEBUG)) { \ | ||||
|                     fprintf(stderr, __VA_ARGS__);            \ | ||||
| #  define RAWLOG(l, ...) {                                      \ | ||||
|                 if ((g_debuglog_enable) & (l<=ZSTD_DEBUG)) {    \ | ||||
|                     fprintf(stderr, __VA_ARGS__);               \ | ||||
|             }   } | ||||
| #  define DEBUGLOG(l, ...) {                                 \ | ||||
|                 if ((g_debuglog_enable) & (l<=ZSTD_DEBUG)) { \ | ||||
|                     fprintf(stderr, __FILE__ ": ");          \ | ||||
|                     fprintf(stderr, __VA_ARGS__);            \ | ||||
|                     fprintf(stderr, " \n");                  \ | ||||
| #  define DEBUGLOG(l, ...) {                                    \ | ||||
|                 if ((g_debuglog_enable) & (l<=ZSTD_DEBUG)) {    \ | ||||
|                     fprintf(stderr, __FILE__ ": " __VA_ARGS__); \ | ||||
|                     fprintf(stderr, " \n");                     \ | ||||
|             }   } | ||||
| #else | ||||
| #  define RAWLOG(l, ...)      {}    /* disabled */ | ||||
|   | ||||
| @@ -161,7 +161,7 @@ static void ZSTD_cLevelToCCtxParams_srcSize(ZSTD_CCtx_params* CCtxParams, U64 sr | ||||
|  | ||||
| static void ZSTD_cLevelToCParams(ZSTD_CCtx* cctx) | ||||
| { | ||||
|     DEBUGLOG(4, "ZSTD_cLevelToCParams"); | ||||
|     DEBUGLOG(4, "ZSTD_cLevelToCParams: level=%i", cctx->requestedParams.compressionLevel); | ||||
|     ZSTD_cLevelToCCtxParams_srcSize( | ||||
|             &cctx->requestedParams, cctx->pledgedSrcSizePlusOne-1); | ||||
| } | ||||
| @@ -169,7 +169,7 @@ static void ZSTD_cLevelToCParams(ZSTD_CCtx* cctx) | ||||
| static void ZSTD_cLevelToCCtxParams(ZSTD_CCtx_params* CCtxParams) | ||||
| { | ||||
|     DEBUGLOG(4, "ZSTD_cLevelToCCtxParams"); | ||||
|     ZSTD_cLevelToCCtxParams_srcSize(CCtxParams, 0); | ||||
|     ZSTD_cLevelToCCtxParams_srcSize(CCtxParams, ZSTD_CONTENTSIZE_UNKNOWN); | ||||
| } | ||||
|  | ||||
| static ZSTD_CCtx_params ZSTD_makeCCtxParamsFromCParams( | ||||
| @@ -247,7 +247,7 @@ static ZSTD_CCtx_params ZSTD_assignParamsToCCtxParams( | ||||
|  | ||||
| size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned value) | ||||
| { | ||||
|     DEBUGLOG(4, "ZSTD_CCtx_setParameter"); | ||||
|     DEBUGLOG(4, "ZSTD_CCtx_setParameter (%u, %u)", (U32)param, value); | ||||
|     if (cctx->streamStage != zcss_init) return ERROR(stage_wrong); | ||||
|  | ||||
|     switch(param) | ||||
| @@ -311,6 +311,7 @@ size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, unsigned v | ||||
| size_t ZSTD_CCtxParam_setParameter( | ||||
|         ZSTD_CCtx_params* CCtxParams, ZSTD_cParameter param, unsigned value) | ||||
| { | ||||
|     DEBUGLOG(4, "ZSTD_CCtxParam_setParameter (%u, %u)", (U32)param, value); | ||||
|     switch(param) | ||||
|     { | ||||
|     case ZSTD_p_format : | ||||
| @@ -326,7 +327,7 @@ size_t ZSTD_CCtxParam_setParameter( | ||||
|         return CCtxParams->compressionLevel; | ||||
|  | ||||
|     case ZSTD_p_windowLog : | ||||
|         DEBUGLOG(4, "setting windowLog=%u", value); | ||||
|         DEBUGLOG(4, "ZSTD_CCtxParam_setParameter: set windowLog=%u", value); | ||||
|         if (value) {  /* 0 : does not change current windowLog */ | ||||
|             CLAMPCHECK(value, ZSTD_WINDOWLOG_MIN, ZSTD_WINDOWLOG_MAX); | ||||
|             ZSTD_cLevelToCCtxParams(CCtxParams); | ||||
| @@ -728,10 +729,7 @@ size_t ZSTD_estimateCStreamSize(int compressionLevel) { | ||||
| static U32 ZSTD_equivalentCParams(ZSTD_compressionParameters cParams1, | ||||
|                                   ZSTD_compressionParameters cParams2) | ||||
| { | ||||
|     U32 bslog1 = MIN(cParams1.windowLog, ZSTD_BLOCKSIZELOG_MAX); | ||||
|     U32 bslog2 = MIN(cParams2.windowLog, ZSTD_BLOCKSIZELOG_MAX); | ||||
|     return (bslog1 == bslog2)   /* same block size */ | ||||
|          & (cParams1.hashLog  == cParams2.hashLog) | ||||
|     return (cParams1.hashLog  == cParams2.hashLog) | ||||
|          & (cParams1.chainLog == cParams2.chainLog) | ||||
|          & (cParams1.strategy == cParams2.strategy)   /* opt parser space */ | ||||
|          & ((cParams1.searchLength==3) == (cParams2.searchLength==3));  /* hashlog3 space */ | ||||
| @@ -755,24 +753,33 @@ typedef enum { ZSTDb_not_buffered, ZSTDb_buffered } ZSTD_buffered_policy_e; | ||||
| /* ZSTD_sufficientBuff() : | ||||
|  * check internal buffers exist for streaming if buffPol == ZSTDb_buffered . | ||||
|  * Note : they are assumed to be correctly sized if ZSTD_equivalentCParams()==1 */ | ||||
| static U32 ZSTD_sufficientBuff(size_t bufferSize, ZSTD_buffered_policy_e buffPol, ZSTD_compressionParameters cParams2, U64 pledgedSrcSize) | ||||
| static U32 ZSTD_sufficientBuff(size_t bufferSize1, size_t blockSize1, | ||||
|                             ZSTD_buffered_policy_e buffPol2, | ||||
|                             ZSTD_compressionParameters cParams2, | ||||
|                             U64 pledgedSrcSize) | ||||
| { | ||||
|     size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << cParams2.windowLog), pledgedSrcSize)); | ||||
|     size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize); | ||||
|     size_t const neededBufferSize = (buffPol==ZSTDb_buffered) ? windowSize + blockSize : 0; | ||||
|     return (neededBufferSize <= bufferSize); | ||||
|     size_t const windowSize2 = MAX(1, (size_t)MIN(((U64)1 << cParams2.windowLog), pledgedSrcSize)); | ||||
|     size_t const blockSize2 = MIN(ZSTD_BLOCKSIZE_MAX, windowSize2); | ||||
|     size_t const neededBufferSize2 = (buffPol2==ZSTDb_buffered) ? windowSize2 + blockSize2 : 0; | ||||
|     DEBUGLOG(4, "ZSTD_sufficientBuff: windowSize2=%u from wlog=%u", | ||||
|                 (U32)windowSize2, cParams2.windowLog); | ||||
|     DEBUGLOG(4, "ZSTD_sufficientBuff: blockSize2 %u <=? blockSize1 %u", | ||||
|                 (U32)blockSize2, (U32)blockSize1); | ||||
|     return (blockSize2 <= blockSize1) /* seqStore space depends on blockSize */ | ||||
|          & (neededBufferSize2 <= bufferSize1); | ||||
| } | ||||
|  | ||||
| /** Equivalence for resetCCtx purposes */ | ||||
| static U32 ZSTD_equivalentParams(ZSTD_CCtx_params params1, | ||||
|                                  ZSTD_CCtx_params params2, | ||||
|                                  size_t buffSize1, | ||||
|                                  size_t buffSize1, size_t blockSize1, | ||||
|                                  ZSTD_buffered_policy_e buffPol2, | ||||
|                                  U64 pledgedSrcSize) | ||||
| { | ||||
|     DEBUGLOG(4, "ZSTD_equivalentParams: pledgedSrcSize=%u", (U32)pledgedSrcSize); | ||||
|     return ZSTD_equivalentCParams(params1.cParams, params2.cParams) && | ||||
|            ZSTD_equivalentLdmParams(params1.ldmParams, params2.ldmParams) && | ||||
|            ZSTD_sufficientBuff(buffSize1, buffPol2, params2.cParams, pledgedSrcSize); | ||||
|            ZSTD_sufficientBuff(buffSize1, blockSize1, buffPol2, params2.cParams, pledgedSrcSize); | ||||
| } | ||||
|  | ||||
| /*! ZSTD_continueCCtx() : | ||||
| @@ -780,7 +787,11 @@ static U32 ZSTD_equivalentParams(ZSTD_CCtx_params params1, | ||||
| static size_t ZSTD_continueCCtx(ZSTD_CCtx* cctx, ZSTD_CCtx_params params, U64 pledgedSrcSize) | ||||
| { | ||||
|     U32 const end = (U32)(cctx->nextSrc - cctx->base); | ||||
|     DEBUGLOG(4, "continue mode"); | ||||
|     size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << params.cParams.windowLog), pledgedSrcSize)); | ||||
|     size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize); | ||||
|     DEBUGLOG(4, "ZSTD_continueCCtx"); | ||||
|  | ||||
|     cctx->blockSize = blockSize;   /* previous block size could be different even for same windowLog, due to pledgedSrcSize */ | ||||
|     cctx->appliedParams = params; | ||||
|     cctx->pledgedSrcSizePlusOne = pledgedSrcSize+1; | ||||
|     cctx->consumedSrcSize = 0; | ||||
| @@ -809,12 +820,16 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, | ||||
|                                       ZSTD_compResetPolicy_e const crp, | ||||
|                                       ZSTD_buffered_policy_e const zbuff) | ||||
| { | ||||
|     DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u", (U32)pledgedSrcSize); | ||||
|     DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u, wlog=%u", | ||||
|                 (U32)pledgedSrcSize, params.cParams.windowLog); | ||||
|     assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams))); | ||||
|  | ||||
|     if (crp == ZSTDcrp_continue) { | ||||
|         if (ZSTD_equivalentParams(params, zc->appliedParams, zc->inBuffSize, zbuff, pledgedSrcSize)) { | ||||
|             DEBUGLOG(4, "ZSTD_equivalentParams()==1 -> continue mode"); | ||||
|         if (ZSTD_equivalentParams(zc->appliedParams, params, | ||||
|                                 zc->inBuffSize, zc->blockSize, | ||||
|                                 zbuff, pledgedSrcSize)) { | ||||
|             DEBUGLOG(4, "ZSTD_equivalentParams()==1 -> continue mode (wLog1=%u, blockSize1=%u)", | ||||
|                         zc->appliedParams.cParams.windowLog, (U32)zc->blockSize); | ||||
|             assert(!(params.ldmParams.enableLdm && | ||||
|                      params.ldmParams.hashEveryLog == ZSTD_LDM_HASHEVERYLOG_NOTSET)); | ||||
|             zc->entropy->hufCTable_repeatMode = HUF_repeat_none; | ||||
| @@ -865,8 +880,8 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, | ||||
|                                        tableSpace + tokenSpace + bufferSpace; | ||||
|             DEBUGLOG(4, "Need %uKB workspace, including %uKB for tables, and %uKB for buffers", | ||||
|                         (U32)(neededSpace>>10), (U32)(tableSpace>>10), (U32)(bufferSpace>>10)); | ||||
|             DEBUGLOG(4, "chainSize: %u - hSize: %u - h3Size: %u - windowSize: %u", | ||||
|                         (U32)chainSize, (U32)hSize, (U32)h3Size, (U32)windowSize); | ||||
|             DEBUGLOG(4, "chainSize: %u - hSize: %u - h3Size: %u - windowSize: %u - blockSize: %u", | ||||
|                         (U32)chainSize, (U32)hSize, (U32)h3Size, (U32)windowSize, (U32)blockSize); | ||||
|  | ||||
|             if (zc->workSpaceSize < neededSpace) {  /* too small : resize */ | ||||
|                 DEBUGLOG(4, "Need to update workSpaceSize from %uK to %uK", | ||||
| @@ -1666,6 +1681,7 @@ static size_t ZSTD_compress_frameChunk (ZSTD_CCtx* cctx, | ||||
|     U32 const maxDist = (U32)1 << cctx->appliedParams.cParams.windowLog; | ||||
|     assert(cctx->appliedParams.cParams.windowLog <= 31); | ||||
|  | ||||
|     DEBUGLOG(5, "ZSTD_compress_frameChunk (blockSize=%u)", (U32)blockSize); | ||||
|     if (cctx->appliedParams.fParams.checksumFlag && srcSize) | ||||
|         XXH64_update(&cctx->xxhState, src, srcSize); | ||||
|  | ||||
| @@ -1838,6 +1854,7 @@ static size_t ZSTD_compressContinue_internal (ZSTD_CCtx* cctx, | ||||
|         cctx->lowLimit = lowLimitMax; | ||||
|     } | ||||
|  | ||||
|     DEBUGLOG(5, "ZSTD_compressContinue_internal (blockSize=%u)", (U32)cctx->blockSize); | ||||
|     {   size_t const cSize = frame ? | ||||
|                              ZSTD_compress_frameChunk (cctx, dst, dstCapacity, src, srcSize, lastFrameChunk) : | ||||
|                              ZSTD_compressBlock_internal (cctx, dst, dstCapacity, src, srcSize); | ||||
| @@ -2062,7 +2079,7 @@ size_t ZSTD_compressBegin_internal(ZSTD_CCtx* cctx, | ||||
|                              ZSTD_CCtx_params params, U64 pledgedSrcSize, | ||||
|                              ZSTD_buffered_policy_e zbuff) | ||||
| { | ||||
|     DEBUGLOG(4, "ZSTD_compressBegin_internal"); | ||||
|     DEBUGLOG(4, "ZSTD_compressBegin_internal: wlog=%u", params.cParams.windowLog); | ||||
|     /* params are supposed to be fully validated at this point */ | ||||
|     assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams))); | ||||
|     assert(!((dict) && (cdict)));  /* either dict or cdict, not both */ | ||||
| @@ -2086,7 +2103,7 @@ size_t ZSTD_compressBegin_advanced_internal(ZSTD_CCtx* cctx, | ||||
|                                     ZSTD_CCtx_params params, | ||||
|                                     unsigned long long pledgedSrcSize) | ||||
| { | ||||
|     DEBUGLOG(4, "ZSTD_compressBegin_advanced_internal"); | ||||
|     DEBUGLOG(4, "ZSTD_compressBegin_advanced_internal: wlog=%u", params.cParams.windowLog); | ||||
|     /* compression parameters verification and optimization */ | ||||
|     CHECK_F( ZSTD_checkCParams(params.cParams) ); | ||||
|     return ZSTD_compressBegin_internal(cctx, | ||||
|   | ||||
| @@ -355,7 +355,7 @@ void ZSTDMT_compressChunk(void* jobDescription) | ||||
|  | ||||
|     if (job->cdict) { | ||||
|         size_t const initError = ZSTD_compressBegin_advanced_internal(cctx, NULL, 0, ZSTD_dm_auto, job->cdict, job->params, job->fullFrameSize); | ||||
|         DEBUGLOG(4, "ZSTDMT_compressChunk: init using CDict"); | ||||
|         DEBUGLOG(4, "ZSTDMT_compressChunk: init using CDict (windowLog=%u)", job->params.cParams.windowLog); | ||||
|         assert(job->firstChunk);  /* only allowed for first job */ | ||||
|         if (ZSTD_isError(initError)) { job->cSize = initError; goto _endJob; } | ||||
|     } else {  /* srcStart points at reloaded section */ | ||||
| @@ -367,9 +367,11 @@ void ZSTDMT_compressChunk(void* jobDescription) | ||||
|             job->cSize = forceWindowError; | ||||
|             goto _endJob; | ||||
|         } | ||||
|         /* load dictionary in "content-only" mode (no header analysis) */ | ||||
|         {   size_t const initError = ZSTD_compressBegin_advanced_internal(cctx, job->srcStart, job->prefixSize, ZSTD_dm_rawContent, NULL, jobParams, pledgedSrcSize); | ||||
|             DEBUGLOG(5, "ZSTD_compressBegin_advanced_internal called with windowLog = %u ", jobParams.cParams.windowLog); | ||||
|         DEBUGLOG(5, "ZSTDMT_compressChunk: invoking ZSTD_compressBegin_advanced_internal with windowLog = %u ", jobParams.cParams.windowLog); | ||||
|         {   size_t const initError = ZSTD_compressBegin_advanced_internal(cctx, | ||||
|                                         job->srcStart, job->prefixSize, ZSTD_dm_rawContent, /* load dictionary in "content-only" mode (no header analysis) */ | ||||
|                                         NULL, | ||||
|                                         jobParams, pledgedSrcSize); | ||||
|             if (ZSTD_isError(initError)) { | ||||
|                 DEBUGLOG(5, "ZSTD_compressBegin_advanced_internal error : %s ", ZSTD_getErrorName(initError)); | ||||
|                 job->cSize = initError; | ||||
| @@ -646,8 +648,7 @@ static size_t ZSTDMT_compress_advanced_internal( | ||||
|     assert(jobParams.nbThreads == 0); | ||||
|     assert(mtctx->cctxPool->totalCCtx == params.nbThreads); | ||||
|  | ||||
|     DEBUGLOG(4, "ZSTDMT_compress_advanced_internal"); | ||||
|     DEBUGLOG(4, "nbChunks  : %2u (raw chunkSize : %u bytes; fixed chunkSize: %u)   ", | ||||
|     DEBUGLOG(4, "ZSTDMT_compress_advanced_internal: nbChunks=%2u (rawSize=%u bytes; fixedSize=%u)  ", | ||||
|                 nbChunks, (U32)proposedChunkSize, (U32)avgChunkSize); | ||||
|     if (nbChunks==1) {   /* fallback to single-thread mode */ | ||||
|         ZSTD_CCtx* const cctx = mtctx->cctxPool->cctx[0]; | ||||
| @@ -697,7 +698,7 @@ static size_t ZSTDMT_compress_advanced_internal( | ||||
|                 XXH64_update(&xxh64, srcStart + frameStartPos, chunkSize); | ||||
|             } | ||||
|  | ||||
|             DEBUGLOG(5, "posting job %u   (%u bytes)", u, (U32)chunkSize); | ||||
|             DEBUGLOG(5, "ZSTDMT_compress_advanced_internal: posting job %u  (%u bytes)", u, (U32)chunkSize); | ||||
|             DEBUG_PRINTHEX(6, mtctx->jobs[u].srcStart, 12); | ||||
|             POOL_add(mtctx->factory, ZSTDMT_compressChunk, &mtctx->jobs[u]); | ||||
|  | ||||
| @@ -902,8 +903,7 @@ static size_t ZSTDMT_createCompressionJob(ZSTDMT_CCtx* zcs, size_t srcSize, unsi | ||||
| { | ||||
|     unsigned const jobID = zcs->nextJobID & zcs->jobIDMask; | ||||
|  | ||||
|     DEBUGLOG(5, "ZSTDMT_createCompressionJob"); | ||||
|     DEBUGLOG(5, "preparing job %u to compress %u bytes with %u preload ", | ||||
|     DEBUGLOG(5, "ZSTDMT_createCompressionJob: preparing job %u to compress %u bytes with %u preload ", | ||||
|                 zcs->nextJobID, (U32)srcSize, (U32)zcs->dictSize); | ||||
|     zcs->jobs[jobID].src = zcs->inBuff.buffer; | ||||
|     zcs->jobs[jobID].srcStart = zcs->inBuff.buffer.start; | ||||
| @@ -954,7 +954,7 @@ static size_t ZSTDMT_createCompressionJob(ZSTDMT_CCtx* zcs, size_t srcSize, unsi | ||||
|             zcs->params.fParams.checksumFlag = 0; | ||||
|     }   } | ||||
|  | ||||
|     DEBUGLOG(4, "posting job %u : %u bytes  (end:%u) (note : doneJob = %u=>%u)", | ||||
|     DEBUGLOG(5, "ZSTDMT_createCompressionJob: posting job %u : %u bytes  (end:%u) (note : doneJob = %u=>%u)", | ||||
|                 zcs->nextJobID, | ||||
|                 (U32)zcs->jobs[jobID].srcSize, | ||||
|                 zcs->jobs[jobID].lastChunk, | ||||
|   | ||||
| @@ -25,6 +25,7 @@ | ||||
| #include <stdlib.h>       /* free */ | ||||
| #include <stdio.h>        /* fgets, sscanf */ | ||||
| #include <string.h>       /* strcmp */ | ||||
| #include <assert.h> | ||||
| #define ZSTD_STATIC_LINKING_ONLY  /* ZSTD_compressContinue, ZSTD_compressBlock */ | ||||
| #include "zstd.h"         /* ZSTD_VERSION_STRING */ | ||||
| #include "zstd_errors.h"  /* ZSTD_getErrorCode */ | ||||
| @@ -94,6 +95,22 @@ static unsigned FUZ_highbit32(U32 v32) | ||||
| } | ||||
|  | ||||
|  | ||||
| /*============================================= | ||||
| *   Test macros | ||||
| =============================================*/ | ||||
| #define CHECK_Z(f) {                               \ | ||||
|     size_t const err = f;                          \ | ||||
|     if (ZSTD_isError(err)) {                       \ | ||||
|         DISPLAY("Error => %s : %s ",               \ | ||||
|                 #f, ZSTD_getErrorName(err));       \ | ||||
|         exit(1);                                   \ | ||||
| }   } | ||||
|  | ||||
| #define CHECK_V(var, fn)  size_t const var = fn; if (ZSTD_isError(var)) goto _output_error | ||||
| #define CHECK(fn)  { CHECK_V(err, fn); } | ||||
| #define CHECKPLUS(var, fn, more)  { CHECK_V(var, fn); more; } | ||||
|  | ||||
|  | ||||
| /*============================================= | ||||
| *   Memory Tests | ||||
| =============================================*/ | ||||
| @@ -143,14 +160,6 @@ static void FUZ_displayMallocStats(mallocCounter_t count) | ||||
|         (U32)(count.totalMalloc >> 10)); | ||||
| } | ||||
|  | ||||
| #define CHECK_Z(f) {                               \ | ||||
|     size_t const err = f;                          \ | ||||
|     if (ZSTD_isError(err)) {                       \ | ||||
|         DISPLAY("Error => %s : %s ",               \ | ||||
|                 #f, ZSTD_getErrorName(err));       \ | ||||
|         exit(1);                                   \ | ||||
| }   } | ||||
|  | ||||
| static int FUZ_mallocTests(unsigned seed, double compressibility, unsigned part) | ||||
| { | ||||
|     size_t const inSize = 64 MB + 16 MB + 4 MB + 1 MB + 256 KB + 64 KB; /* 85.3 MB */ | ||||
| @@ -256,10 +265,6 @@ static int FUZ_mallocTests(unsigned seed, double compressibility, unsigned part) | ||||
| *   Unit tests | ||||
| =============================================*/ | ||||
|  | ||||
| #define CHECK_V(var, fn)  size_t const var = fn; if (ZSTD_isError(var)) goto _output_error | ||||
| #define CHECK(fn)  { CHECK_V(err, fn); } | ||||
| #define CHECKPLUS(var, fn, more)  { CHECK_V(var, fn); more; } | ||||
|  | ||||
| static int basicUnitTests(U32 seed, double compressibility) | ||||
| { | ||||
|     size_t const CNBuffSize = 5 MB; | ||||
| @@ -365,6 +370,23 @@ static int basicUnitTests(U32 seed, double compressibility) | ||||
|     } | ||||
|     DISPLAYLEVEL(4, "OK \n"); | ||||
|  | ||||
|     DISPLAYLEVEL(4, "test%di : re-use CCtx with expanding block size : ", testNb++); | ||||
|     {   ZSTD_CCtx* const cctx = ZSTD_createCCtx(); | ||||
|         ZSTD_parameters const params = ZSTD_getParams(1, ZSTD_CONTENTSIZE_UNKNOWN, 0); | ||||
|         assert(params.fParams.contentSizeFlag == 1);  /* block size will be adapted if pledgedSrcSize is enabled */ | ||||
|         CHECK_Z( ZSTD_compressBegin_advanced(cctx, NULL, 0, params, 1 /*pledgedSrcSize*/) ); | ||||
|         CHECK_Z( ZSTD_compressEnd(cctx, compressedBuffer, compressedBufferSize, CNBuffer, 1) ); /* creates a block size of 1 */ | ||||
|  | ||||
|         CHECK_Z( ZSTD_compressBegin_advanced(cctx, NULL, 0, params, ZSTD_CONTENTSIZE_UNKNOWN) );  /* re-use same parameters */ | ||||
|         {   size_t const inSize = 2* 128 KB; | ||||
|             size_t const outSize = ZSTD_compressBound(inSize); | ||||
|             CHECK_Z( ZSTD_compressEnd(cctx, compressedBuffer, outSize, CNBuffer, inSize) ); | ||||
|             /* will fail if blockSize is not resized */ | ||||
|         } | ||||
|         ZSTD_freeCCtx(cctx); | ||||
|     } | ||||
|     DISPLAYLEVEL(4, "OK \n"); | ||||
|  | ||||
|     /* Static CCtx tests */ | ||||
| #define STATIC_CCTX_LEVEL 3 | ||||
|     DISPLAYLEVEL(4, "test%3i : create static CCtx for level %u :", testNb++, STATIC_CCTX_LEVEL); | ||||
|   | ||||
| @@ -1527,7 +1527,7 @@ static int fuzzerTests_newAPI(U32 seed, U32 nbTests, unsigned startTest, double | ||||
|                                (MAX(testLog, dictLog) / 2))) + | ||||
|                                1; | ||||
|             U32 const cLevel = MIN(cLevelCandidate, cLevelMax); | ||||
|             DISPLAYLEVEL(5, "t%u: cLevel : %u \n", testNb, cLevel); | ||||
|             DISPLAYLEVEL(5, "t%u: base cLevel : %u \n", testNb, cLevel); | ||||
|             maxTestSize = FUZ_rLogLength(&lseed, testLog); | ||||
|             DISPLAYLEVEL(5, "t%u: maxTestSize : %u \n", testNb, (U32)maxTestSize); | ||||
|             oldTestLog = testLog; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user