fixed context downsize with initStatic
When context is created using initStatic, no resize is possible. fix : only bump oversizeDuration when !initStatic
This commit is contained in:
@@ -99,9 +99,8 @@ ZSTD_CCtx* ZSTD_initStaticCCtx(void *workspace, size_t workspaceSize)
|
|||||||
ZSTD_cwksp_init(&ws, workspace, workspaceSize);
|
ZSTD_cwksp_init(&ws, workspace, workspaceSize);
|
||||||
|
|
||||||
cctx = (ZSTD_CCtx*)ZSTD_cwksp_reserve_object(&ws, sizeof(ZSTD_CCtx));
|
cctx = (ZSTD_CCtx*)ZSTD_cwksp_reserve_object(&ws, sizeof(ZSTD_CCtx));
|
||||||
if (cctx == NULL) {
|
if (cctx == NULL) return NULL;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
memset(cctx, 0, sizeof(ZSTD_CCtx));
|
memset(cctx, 0, sizeof(ZSTD_CCtx));
|
||||||
ZSTD_cwksp_move(&cctx->workspace, &ws);
|
ZSTD_cwksp_move(&cctx->workspace, &ws);
|
||||||
cctx->staticSize = workspaceSize;
|
cctx->staticSize = workspaceSize;
|
||||||
@@ -110,8 +109,7 @@ ZSTD_CCtx* ZSTD_initStaticCCtx(void *workspace, size_t workspaceSize)
|
|||||||
if (!ZSTD_cwksp_check_available(&cctx->workspace, HUF_WORKSPACE_SIZE + 2 * sizeof(ZSTD_compressedBlockState_t))) return NULL;
|
if (!ZSTD_cwksp_check_available(&cctx->workspace, HUF_WORKSPACE_SIZE + 2 * sizeof(ZSTD_compressedBlockState_t))) return NULL;
|
||||||
cctx->blockState.prevCBlock = (ZSTD_compressedBlockState_t*)ZSTD_cwksp_reserve_object(&cctx->workspace, sizeof(ZSTD_compressedBlockState_t));
|
cctx->blockState.prevCBlock = (ZSTD_compressedBlockState_t*)ZSTD_cwksp_reserve_object(&cctx->workspace, sizeof(ZSTD_compressedBlockState_t));
|
||||||
cctx->blockState.nextCBlock = (ZSTD_compressedBlockState_t*)ZSTD_cwksp_reserve_object(&cctx->workspace, sizeof(ZSTD_compressedBlockState_t));
|
cctx->blockState.nextCBlock = (ZSTD_compressedBlockState_t*)ZSTD_cwksp_reserve_object(&cctx->workspace, sizeof(ZSTD_compressedBlockState_t));
|
||||||
cctx->entropyWorkspace = (U32*)ZSTD_cwksp_reserve_object(
|
cctx->entropyWorkspace = (U32*)ZSTD_cwksp_reserve_object(&cctx->workspace, HUF_WORKSPACE_SIZE);
|
||||||
&cctx->workspace, HUF_WORKSPACE_SIZE);
|
|
||||||
cctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
|
cctx->bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid());
|
||||||
return cctx;
|
return cctx;
|
||||||
}
|
}
|
||||||
@@ -421,9 +419,8 @@ ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter param)
|
|||||||
return bounds;
|
return bounds;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{ ZSTD_bounds const boundError = { ERROR(parameter_unsupported), 0, 0 };
|
bounds.error = ERROR(parameter_unsupported);
|
||||||
return boundError;
|
return bounds;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1458,7 +1455,7 @@ static size_t ZSTD_resetCCtx_internal(ZSTD_CCtx* zc,
|
|||||||
needsIndexReset = ZSTDirp_reset;
|
needsIndexReset = ZSTDirp_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 */
|
/* 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 cctxSpace = zc->staticSize ? ZSTD_cwksp_alloc_size(sizeof(ZSTD_CCtx)) : 0;
|
||||||
|
|||||||
+18
-4
@@ -32,6 +32,7 @@
|
|||||||
#include "fse.h"
|
#include "fse.h"
|
||||||
#include "zstd.h" /* ZSTD_VERSION_STRING */
|
#include "zstd.h" /* ZSTD_VERSION_STRING */
|
||||||
#include "zstd_errors.h" /* ZSTD_getErrorCode */
|
#include "zstd_errors.h" /* ZSTD_getErrorCode */
|
||||||
|
#include "zstd_internal.h" /* ZSTD_WORKSPACETOOLARGE_MAXDURATION */
|
||||||
#include "zstdmt_compress.h"
|
#include "zstdmt_compress.h"
|
||||||
#define ZDICT_STATIC_LINKING_ONLY
|
#define ZDICT_STATIC_LINKING_ONLY
|
||||||
#include "zdict.h" /* ZDICT_trainFromBuffer */
|
#include "zdict.h" /* ZDICT_trainFromBuffer */
|
||||||
@@ -1065,7 +1066,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
|||||||
DISPLAYLEVEL(3, "OK \n");
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
/* Static CCtx tests */
|
/* Static CCtx tests */
|
||||||
#define STATIC_CCTX_LEVEL 3
|
#define STATIC_CCTX_LEVEL 4
|
||||||
DISPLAYLEVEL(3, "test%3i : create static CCtx for level %u : ", testNb++, STATIC_CCTX_LEVEL);
|
DISPLAYLEVEL(3, "test%3i : create static CCtx for level %u : ", testNb++, STATIC_CCTX_LEVEL);
|
||||||
{ size_t const staticCStreamSize = ZSTD_estimateCStreamSize(STATIC_CCTX_LEVEL);
|
{ size_t const staticCStreamSize = ZSTD_estimateCStreamSize(STATIC_CCTX_LEVEL);
|
||||||
void* const staticCCtxBuffer = malloc(staticCStreamSize);
|
void* const staticCCtxBuffer = malloc(staticCStreamSize);
|
||||||
@@ -1079,19 +1080,31 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
|||||||
testResult = 1;
|
testResult = 1;
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
{ size_t const staticCCtxSize = ZSTD_estimateCCtxSize(STATIC_CCTX_LEVEL);
|
{ size_t const smallInSize = 32 KB;
|
||||||
|
size_t const staticCCtxSize = ZSTD_estimateCCtxSize(STATIC_CCTX_LEVEL);
|
||||||
ZSTD_CCtx* staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, staticCCtxSize);
|
ZSTD_CCtx* staticCCtx = ZSTD_initStaticCCtx(staticCCtxBuffer, staticCCtxSize);
|
||||||
ZSTD_DCtx* const staticDCtx = ZSTD_initStaticDCtx(staticDCtxBuffer, staticDCtxSize);
|
ZSTD_DCtx* const staticDCtx = ZSTD_initStaticDCtx(staticDCtxBuffer, staticDCtxSize);
|
||||||
if ((staticCCtx==NULL) || (staticDCtx==NULL)) goto _output_error;
|
|
||||||
DISPLAYLEVEL(4, "CCtx size = %u, ", (U32)staticCCtxSize);
|
DISPLAYLEVEL(4, "CCtx size = %u, ", (U32)staticCCtxSize);
|
||||||
|
if ((staticCCtx==NULL) || (staticDCtx==NULL)) goto _output_error;
|
||||||
DISPLAYLEVEL(3, "OK \n");
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
/*
|
||||||
DISPLAYLEVEL(3, "test%3i : compress immediately with static CCtx : ", testNb++);
|
DISPLAYLEVEL(3, "test%3i : compress immediately with static CCtx : ", testNb++);
|
||||||
CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx,
|
CHECK_VAR(cSize, ZSTD_compressCCtx(staticCCtx,
|
||||||
compressedBuffer, compressedBufferSize,
|
compressedBuffer, compressedBufferSize,
|
||||||
CNBuffer, CNBuffSize, STATIC_CCTX_LEVEL) );
|
CNBuffer, CNBuffSize, STATIC_CCTX_LEVEL) );
|
||||||
DISPLAYLEVEL(3, "OK (%u bytes : %.2f%%)\n",
|
DISPLAYLEVEL(3, "OK (%u bytes : %.2f%%)\n",
|
||||||
(unsigned)cSize, (double)cSize/CNBuffSize*100);
|
(unsigned)cSize, (double)cSize/CNBuffSize*100);
|
||||||
|
*/
|
||||||
|
DISPLAYLEVEL(3, "test%3i : compress small input often enough to trigger context reduce : ", testNb++);
|
||||||
|
{ int nbc;
|
||||||
|
assert(CNBuffSize > smallInSize + ZSTD_WORKSPACETOOLARGE_MAXDURATION + 3);
|
||||||
|
for (nbc=0; nbc<ZSTD_WORKSPACETOOLARGE_MAXDURATION+2; nbc++) {
|
||||||
|
CHECK_Z(ZSTD_compressCCtx(staticCCtx,
|
||||||
|
compressedBuffer, compressedBufferSize,
|
||||||
|
(char*)CNBuffer + nbc, smallInSize,
|
||||||
|
STATIC_CCTX_LEVEL) );
|
||||||
|
} }
|
||||||
|
DISPLAYLEVEL(3, "OK \n")
|
||||||
|
|
||||||
DISPLAYLEVEL(3, "test%3i : init CCtx for level %u : ", testNb++, STATIC_CCTX_LEVEL);
|
DISPLAYLEVEL(3, "test%3i : init CCtx for level %u : ", testNb++, STATIC_CCTX_LEVEL);
|
||||||
CHECK_Z( ZSTD_compressBegin(staticCCtx, STATIC_CCTX_LEVEL) );
|
CHECK_Z( ZSTD_compressBegin(staticCCtx, STATIC_CCTX_LEVEL) );
|
||||||
@@ -2661,6 +2674,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
|||||||
DISPLAYLEVEL(3, "OK \n");
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* note : this test is rather long, it would be great to find a way to speed up its execution */
|
||||||
DISPLAYLEVEL(3, "test%3i : table cleanliness through index reduction : ", testNb++);
|
DISPLAYLEVEL(3, "test%3i : table cleanliness through index reduction : ", testNb++);
|
||||||
{
|
{
|
||||||
int cLevel;
|
int cLevel;
|
||||||
|
|||||||
Reference in New Issue
Block a user