only computing sizes once

This commit is contained in:
Bimba Shrestha 2020-04-03 14:12:23 -07:00
parent a4cbe79ccb
commit ae47d50355

View File

@ -1508,16 +1508,14 @@ MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src,
return length; return length;
} }
static int ZSTD_isOversized(ZSTD_DStream* zds) static int ZSTD_isOversized(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize)
{ {
size_t const neededInBuffSize = MAX(zds->fParams.blockSizeMax, 4 /* frame checksum */);
size_t const neededOutBuffSize = ZSTD_decodingBufferSize_min(zds->fParams.windowSize, zds->fParams.frameContentSize);
return (zds->inBuffSize + zds->outBuffSize) >= (neededInBuffSize + neededOutBuffSize) * ZSTD_OVERSIZED_FACTOR; return (zds->inBuffSize + zds->outBuffSize) >= (neededInBuffSize + neededOutBuffSize) * ZSTD_OVERSIZED_FACTOR;
} }
static void ZSTD_updateOversizedDuration(ZSTD_DStream* zds) static void ZSTD_updateOversizedDuration(ZSTD_DStream* zds, size_t const neededInBuffSize, size_t const neededOutBuffSize)
{ {
zds->oversizedDuration += ZSTD_isOversized(zds) != 0; zds->oversizedDuration += ZSTD_isOversized(zds, neededInBuffSize, neededOutBuffSize) != 0;
} }
static int ZSTD_isOversizedTooLong(ZSTD_DStream* zds) static int ZSTD_isOversizedTooLong(ZSTD_DStream* zds)
@ -1650,37 +1648,38 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
RETURN_ERROR_IF(zds->fParams.windowSize > zds->maxWindowSize, RETURN_ERROR_IF(zds->fParams.windowSize > zds->maxWindowSize,
frameParameter_windowTooLarge); frameParameter_windowTooLarge);
ZSTD_updateOversizedDuration(zds);
/* Adapt buffer sizes to frame header instructions */ /* Adapt buffer sizes to frame header instructions */
{ size_t const neededInBuffSize = MAX(zds->fParams.blockSizeMax, 4 /* frame checksum */); { size_t const neededInBuffSize = MAX(zds->fParams.blockSizeMax, 4 /* frame checksum */);
size_t const neededOutBuffSize = ZSTD_decodingBufferSize_min(zds->fParams.windowSize, zds->fParams.frameContentSize); size_t const neededOutBuffSize = ZSTD_decodingBufferSize_min(zds->fParams.windowSize, zds->fParams.frameContentSize);
int const tooSmall = (zds->inBuffSize < neededInBuffSize) || (zds->outBuffSize < neededOutBuffSize); ZSTD_updateOversizedDuration(zds, neededInBuffSize, neededOutBuffSize);
int const tooLarge = ZSTD_isOversizedTooLong(zds);
{ int const tooSmall = (zds->inBuffSize < neededInBuffSize) || (zds->outBuffSize < neededOutBuffSize);
if (tooSmall || tooLarge) { int const tooLarge = ZSTD_isOversizedTooLong(zds);
size_t const bufferSize = neededInBuffSize + neededOutBuffSize;
DEBUGLOG(4, "inBuff : from %u to %u", if (tooSmall || tooLarge) {
(U32)zds->inBuffSize, (U32)neededInBuffSize); size_t const bufferSize = neededInBuffSize + neededOutBuffSize;
DEBUGLOG(4, "outBuff : from %u to %u", DEBUGLOG(4, "inBuff : from %u to %u",
(U32)zds->outBuffSize, (U32)neededOutBuffSize); (U32)zds->inBuffSize, (U32)neededInBuffSize);
if (zds->staticSize) { /* static DCtx */ DEBUGLOG(4, "outBuff : from %u to %u",
DEBUGLOG(4, "staticSize : %u", (U32)zds->staticSize); (U32)zds->outBuffSize, (U32)neededOutBuffSize);
assert(zds->staticSize >= sizeof(ZSTD_DCtx)); /* controlled at init */ if (zds->staticSize) { /* static DCtx */
RETURN_ERROR_IF( DEBUGLOG(4, "staticSize : %u", (U32)zds->staticSize);
bufferSize > zds->staticSize - sizeof(ZSTD_DCtx), assert(zds->staticSize >= sizeof(ZSTD_DCtx)); /* controlled at init */
memory_allocation); RETURN_ERROR_IF(
} else { bufferSize > zds->staticSize - sizeof(ZSTD_DCtx),
ZSTD_free(zds->inBuff, zds->customMem); memory_allocation);
zds->inBuffSize = 0; } else {
zds->outBuffSize = 0; ZSTD_free(zds->inBuff, zds->customMem);
zds->inBuff = (char*)ZSTD_malloc(bufferSize, zds->customMem); zds->inBuffSize = 0;
RETURN_ERROR_IF(zds->inBuff == NULL, memory_allocation); zds->outBuffSize = 0;
} zds->inBuff = (char*)ZSTD_malloc(bufferSize, zds->customMem);
zds->inBuffSize = neededInBuffSize; RETURN_ERROR_IF(zds->inBuff == NULL, memory_allocation);
zds->outBuff = zds->inBuff + zds->inBuffSize; }
zds->outBuffSize = neededOutBuffSize; zds->inBuffSize = neededInBuffSize;
} } zds->outBuff = zds->inBuff + zds->inBuffSize;
zds->outBuffSize = neededOutBuffSize;
} } }
zds->streamStage = zdss_read; zds->streamStage = zdss_read;
/* fall-through */ /* fall-through */