]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Merge pull request #2133 from felixhandte/single-size-calculation
authorFelix Handte <w@felixhandte.com>
Thu, 28 May 2020 17:07:18 +0000 (13:07 -0400)
committerGitHub <noreply@github.com>
Thu, 28 May 2020 17:07:18 +0000 (13:07 -0400)
Consolidate CCtx Size Estimation Code

1  2 
lib/compress/zstd_compress.c

index 3f963b1cfff8bc11c9c6d6e8a053132feee728dd,0cd47fc999a6fd4d31ff590a3e1823099dac0441..b9475e920f86b3a3c3dc12541ea1da0792b36b8c
@@@ -1441,40 -1459,24 +1456,24 @@@ static size_t ZSTD_resetCCtx_internal(Z
          size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize);
          U32    const divider = (params.cParams.minMatch==3) ? 3 : 4;
          size_t const maxNbSeq = blockSize / divider;
-         size_t const tokenSpace = ZSTD_cwksp_alloc_size(WILDCOPY_OVERLENGTH + blockSize)
-                                 + ZSTD_cwksp_alloc_size(maxNbSeq * sizeof(seqDef))
-                                 + 3 * ZSTD_cwksp_alloc_size(maxNbSeq * sizeof(BYTE));
          size_t const buffOutSize = (zbuff==ZSTDb_buffered) ? ZSTD_compressBound(blockSize)+1 : 0;
          size_t const buffInSize = (zbuff==ZSTDb_buffered) ? windowSize + blockSize : 0;
-         size_t const matchStateSize = ZSTD_sizeof_matchState(&params.cParams, /* forCCtx */ 1);
          size_t const maxNbLdmSeq = ZSTD_ldm_getMaxNbSeq(params.ldmParams, blockSize);
  
-         ZSTD_indexResetPolicy_e needsIndexReset = zc->initialized ? ZSTDirp_continue : ZSTDirp_reset;
+         int const indexTooClose = ZSTD_indexTooCloseToMax(zc->blockState.matchState.window);
+         ZSTD_indexResetPolicy_e needsIndexReset =
+             (!indexTooClose && zc->initialized) ? ZSTDirp_continue : ZSTDirp_reset;
  
-         if (ZSTD_indexTooCloseToMax(zc->blockState.matchState.window)) {
-             needsIndexReset = ZSTDirp_reset;
-         }
+         size_t const neededSpace =
+             ZSTD_estimateCCtxSize_usingCCtxParams_internal(
+                 &params.cParams, &params.ldmParams, zc->staticSize != 0,
+                 buffInSize, buffOutSize, pledgedSrcSize);
+         FORWARD_IF_ERROR(neededSpace, "cctx size estimate failed!");
  
 -        ZSTD_cwksp_bump_oversized_duration(ws, 0);
 +        if (!zc->staticSize) ZSTD_cwksp_bump_oversized_duration(ws, 0);
  
          /* Check if workspace is large enough, alloc a new one if needed */
-         {   size_t const cctxSpace = zc->staticSize ? ZSTD_cwksp_alloc_size(sizeof(ZSTD_CCtx)) : 0;
-             size_t const entropySpace = ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE);
-             size_t const blockStateSpace = 2 * ZSTD_cwksp_alloc_size(sizeof(ZSTD_compressedBlockState_t));
-             size_t const bufferSpace = ZSTD_cwksp_alloc_size(buffInSize) + ZSTD_cwksp_alloc_size(buffOutSize);
-             size_t const ldmSpace = ZSTD_ldm_getTableSize(params.ldmParams);
-             size_t const ldmSeqSpace = ZSTD_cwksp_alloc_size(maxNbLdmSeq * sizeof(rawSeq));
-             size_t const neededSpace =
-                 cctxSpace +
-                 entropySpace +
-                 blockStateSpace +
-                 ldmSpace +
-                 ldmSeqSpace +
-                 matchStateSize +
-                 tokenSpace +
-                 bufferSpace;
+         {
              int const workspaceTooSmall = ZSTD_cwksp_sizeof(ws) < neededSpace;
              int const workspaceWasteful = ZSTD_cwksp_check_wasteful(ws, neededSpace);
  
  
              ZSTD_window_init(&zc->ldmState.window);
              ZSTD_window_clear(&zc->ldmState.window);
 +            zc->ldmState.loadedDictEnd = 0;
          }
  
+         /* Due to alignment, when reusing a workspace, we can actually consume
+          * up to 3 extra bytes for alignment. See the comments in zstd_cwksp.h
+          */
+         assert(ZSTD_cwksp_used(ws) >= neededSpace &&
+                ZSTD_cwksp_used(ws) <= neededSpace + 3);
          DEBUGLOG(3, "wksp: finished allocating, %zd bytes remain available", ZSTD_cwksp_available_space(ws));
          zc->initialized = 1;