! ZSTD_resetCCtx_internal() : note : `params` are assumed fully validated at this stage */
| 14501 | /*! ZSTD_resetCCtx_internal() : |
| 14502 | note : `params` are assumed fully validated at this stage */ |
| 14503 | static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc, |
| 14504 | ZSTD_CCtx_params params, |
| 14505 | U64 const pledgedSrcSize, |
| 14506 | ZSTD_compResetPolicy_e const crp, |
| 14507 | ZSTD_buffered_policy_e const zbuff) |
| 14508 | { |
| 14509 | ZSTD_cwksp* const ws = &zc->workspace; |
| 14510 | DEBUGLOG(4, "ZSTD_resetCCtx_internal: pledgedSrcSize=%u, wlog=%u", |
| 14511 | (U32)pledgedSrcSize, params.cParams.windowLog); |
| 14512 | assert(!ZSTD_isError(ZSTD_checkCParams(params.cParams))); |
| 14513 | |
| 14514 | zc->isFirstBlock = 1; |
| 14515 | |
| 14516 | if (params.ldmParams.enableLdm) { |
| 14517 | /* Adjust long distance matching parameters */ |
| 14518 | ZSTD_ldm_adjustParameters(¶ms.ldmParams, ¶ms.cParams); |
| 14519 | assert(params.ldmParams.hashLog >= params.ldmParams.bucketSizeLog); |
| 14520 | assert(params.ldmParams.hashRateLog < 32); |
| 14521 | zc->ldmState.hashPower = ZSTD_rollingHash_primePower(params.ldmParams.minMatchLength); |
| 14522 | } |
| 14523 | |
| 14524 | { size_t const windowSize = MAX(1, (size_t)MIN(((U64)1 << params.cParams.windowLog), pledgedSrcSize)); |
| 14525 | size_t const blockSize = MIN(ZSTD_BLOCKSIZE_MAX, windowSize); |
| 14526 | U32 const divider = (params.cParams.minMatch==3) ? 3 : 4; |
| 14527 | size_t const maxNbSeq = blockSize / divider; |
| 14528 | size_t const tokenSpace = ZSTD_cwksp_alloc_size(WILDCOPY_OVERLENGTH + blockSize) |
| 14529 | + ZSTD_cwksp_alloc_size(maxNbSeq * sizeof(seqDef)) |
| 14530 | + 3 * ZSTD_cwksp_alloc_size(maxNbSeq * sizeof(BYTE)); |
| 14531 | size_t const buffOutSize = (zbuff==ZSTDb_buffered) ? ZSTD_compressBound(blockSize)+1 : 0; |
| 14532 | size_t const buffInSize = (zbuff==ZSTDb_buffered) ? windowSize + blockSize : 0; |
| 14533 | size_t const matchStateSize = ZSTD_sizeof_matchState(¶ms.cParams, /* forCCtx */ 1); |
| 14534 | size_t const maxNbLdmSeq = ZSTD_ldm_getMaxNbSeq(params.ldmParams, blockSize); |
| 14535 | |
| 14536 | ZSTD_indexResetPolicy_e needsIndexReset = zc->initialized ? ZSTDirp_continue : ZSTDirp_reset; |
| 14537 | |
| 14538 | if (ZSTD_indexTooCloseToMax(zc->blockState.matchState.window)) { |
| 14539 | needsIndexReset = ZSTDirp_reset; |
| 14540 | } |
| 14541 | |
| 14542 | if (!zc->staticSize) ZSTD_cwksp_bump_oversized_duration(ws, 0); |
| 14543 | |
| 14544 | /* Check if workspace is large enough, alloc a new one if needed */ |
| 14545 | { size_t const cctxSpace = zc->staticSize ? ZSTD_cwksp_alloc_size(sizeof(ZSTD_CCtx)) : 0; |
| 14546 | size_t const entropySpace = ZSTD_cwksp_alloc_size(HUF_WORKSPACE_SIZE); |
| 14547 | size_t const blockStateSpace = 2 * ZSTD_cwksp_alloc_size(sizeof(ZSTD_compressedBlockState_t)); |
| 14548 | size_t const bufferSpace = ZSTD_cwksp_alloc_size(buffInSize) + ZSTD_cwksp_alloc_size(buffOutSize); |
| 14549 | size_t const ldmSpace = ZSTD_ldm_getTableSize(params.ldmParams); |
| 14550 | size_t const ldmSeqSpace = ZSTD_cwksp_alloc_size(maxNbLdmSeq * sizeof(rawSeq)); |
| 14551 | |
| 14552 | size_t const neededSpace = |
| 14553 | cctxSpace + |
| 14554 | entropySpace + |
| 14555 | blockStateSpace + |
| 14556 | ldmSpace + |
| 14557 | ldmSeqSpace + |
| 14558 | matchStateSize + |
| 14559 | tokenSpace + |
| 14560 | bufferSpace; |
no test coverage detected