mirror of
https://github.com/facebook/zstd.git
synced 2025-11-29 00:04:37 -05:00
only computing sizes once
This commit is contained in:
parent
a4cbe79ccb
commit
ae47d50355
@ -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 */
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user