Only Reset the LZ4 Stream when Init'ing a Streaming Block
This commit is contained in:
parent
c32e0319a5
commit
5406c2e479
24
lib/lz4.h
24
lib/lz4.h
@ -358,6 +358,15 @@ LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int or
|
|||||||
#ifdef LZ4_STATIC_LINKING_ONLY
|
#ifdef LZ4_STATIC_LINKING_ONLY
|
||||||
|
|
||||||
/*! LZ4_resetStream_fast() :
|
/*! LZ4_resetStream_fast() :
|
||||||
|
* Use this, like LZ4_resetStream(), to prepare a context for a new chain of
|
||||||
|
* calls to a streaming API (e.g., LZ4_compress_fast_continue()).
|
||||||
|
*
|
||||||
|
* Note:
|
||||||
|
* Using this in advance of a non- streaming-compression function is redundant,
|
||||||
|
* and potentially bad for performance, since they all perform their own custom
|
||||||
|
* reset internally.
|
||||||
|
*
|
||||||
|
* Differences from LZ4_resetStream():
|
||||||
* When an LZ4_stream_t is known to be in a internally coherent state,
|
* When an LZ4_stream_t is known to be in a internally coherent state,
|
||||||
* it can often be prepared for a new compression with almost no work, only
|
* it can often be prepared for a new compression with almost no work, only
|
||||||
* sometimes falling back to the full, expensive reset that is always required
|
* sometimes falling back to the full, expensive reset that is always required
|
||||||
@ -367,13 +376,17 @@ LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int or
|
|||||||
* LZ4_streams are guaranteed to be in a valid state when:
|
* LZ4_streams are guaranteed to be in a valid state when:
|
||||||
* - returned from LZ4_createStream()
|
* - returned from LZ4_createStream()
|
||||||
* - reset by LZ4_resetStream()
|
* - reset by LZ4_resetStream()
|
||||||
* - memset(stream, 0, sizeof(LZ4_stream_t))
|
* - memset(stream, 0, sizeof(LZ4_stream_t)), though this is discouraged
|
||||||
* - the stream was in a valid state and was reset by LZ4_resetStream_fast()
|
* - the stream was in a valid state and was reset by LZ4_resetStream_fast()
|
||||||
* - the stream was in a valid state and was then used in any compression call
|
* - the stream was in a valid state and was then used in any compression call
|
||||||
* that returned success
|
* that returned success
|
||||||
* - the stream was in an indeterminate state and was used in a compression
|
* - the stream was in an indeterminate state and was used in a compression
|
||||||
* call that fully reset the state (LZ4_compress_fast_extState()) and that
|
* call that fully reset the state (e.g., LZ4_compress_fast_extState()) and
|
||||||
* returned success
|
* that returned success
|
||||||
|
*
|
||||||
|
* When a stream isn't known to be in a valid state, it is not safe to pass to
|
||||||
|
* any fastReset or streaming function. It must first be cleansed by the full
|
||||||
|
* LZ4_resetStream().
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr);
|
LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
@ -384,8 +397,9 @@ LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr);
|
|||||||
* to call if the state buffer is known to be correctly initialized already
|
* to call if the state buffer is known to be correctly initialized already
|
||||||
* (see above comment on LZ4_resetStream_fast() for a definition of "correctly
|
* (see above comment on LZ4_resetStream_fast() for a definition of "correctly
|
||||||
* initialized"). From a high level, the difference is that this function
|
* initialized"). From a high level, the difference is that this function
|
||||||
* initializes the provided state with a call to LZ4_resetStream_fast() while
|
* initializes the provided state with a call to something like
|
||||||
* LZ4_compress_fast_extState() starts with a call to LZ4_resetStream().
|
* LZ4_resetStream_fast() while LZ4_compress_fast_extState() starts with a
|
||||||
|
* call to LZ4_resetStream().
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
LZ4LIB_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
||||||
|
|
||||||
|
@ -537,9 +537,18 @@ LZ4F_errorCode_t LZ4F_freeCompressionContext(LZ4F_compressionContext_t LZ4F_comp
|
|||||||
*/
|
*/
|
||||||
static void LZ4F_initStream(void* ctx,
|
static void LZ4F_initStream(void* ctx,
|
||||||
const LZ4F_CDict* cdict,
|
const LZ4F_CDict* cdict,
|
||||||
int level) {
|
int level,
|
||||||
|
LZ4F_blockMode_t blockMode) {
|
||||||
if (level < LZ4HC_CLEVEL_MIN) {
|
if (level < LZ4HC_CLEVEL_MIN) {
|
||||||
LZ4_resetStream_fast((LZ4_stream_t *)ctx);
|
if (cdict != NULL || blockMode == LZ4F_blockLinked) {
|
||||||
|
/* In these cases, we will call LZ4_compress_fast_continue(),
|
||||||
|
* which needs an already reset context. Otherwise, we'll call a
|
||||||
|
* one-shot API. The non-continued APIs internally perform their own
|
||||||
|
* resets at the beginning of their calls, where they know what
|
||||||
|
* tableType they need the context to be in. So in that case this
|
||||||
|
* would be misguided / wasted work. */
|
||||||
|
LZ4_resetStream_fast((LZ4_stream_t*)ctx);
|
||||||
|
}
|
||||||
LZ4_attach_dictionary((LZ4_stream_t *)ctx, cdict ? cdict->fastCtx : NULL);
|
LZ4_attach_dictionary((LZ4_stream_t *)ctx, cdict ? cdict->fastCtx : NULL);
|
||||||
} else {
|
} else {
|
||||||
LZ4_resetStreamHC_fast((LZ4_streamHC_t*)ctx, level);
|
LZ4_resetStreamHC_fast((LZ4_streamHC_t*)ctx, level);
|
||||||
@ -617,7 +626,7 @@ size_t LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctxPtr,
|
|||||||
cctxPtr->cdict = cdict;
|
cctxPtr->cdict = cdict;
|
||||||
if (cctxPtr->prefs.frameInfo.blockMode == LZ4F_blockLinked) {
|
if (cctxPtr->prefs.frameInfo.blockMode == LZ4F_blockLinked) {
|
||||||
/* frame init only for blockLinked : blockIndependent will be init at each block */
|
/* frame init only for blockLinked : blockIndependent will be init at each block */
|
||||||
LZ4F_initStream(cctxPtr->lz4CtxPtr, cdict, cctxPtr->prefs.compressionLevel);
|
LZ4F_initStream(cctxPtr->lz4CtxPtr, cdict, cctxPtr->prefs.compressionLevel, LZ4F_blockLinked);
|
||||||
}
|
}
|
||||||
if (preferencesPtr->compressionLevel >= LZ4HC_CLEVEL_MIN) {
|
if (preferencesPtr->compressionLevel >= LZ4HC_CLEVEL_MIN) {
|
||||||
LZ4_favorDecompressionSpeed((LZ4_streamHC_t*)cctxPtr->lz4CtxPtr, (int)preferencesPtr->favorDecSpeed);
|
LZ4_favorDecompressionSpeed((LZ4_streamHC_t*)cctxPtr->lz4CtxPtr, (int)preferencesPtr->favorDecSpeed);
|
||||||
@ -715,7 +724,7 @@ static size_t LZ4F_makeBlock(void* dst, const void* src, size_t srcSize,
|
|||||||
static int LZ4F_compressBlock(void* ctx, const char* src, char* dst, int srcSize, int dstCapacity, int level, const LZ4F_CDict* cdict)
|
static int LZ4F_compressBlock(void* ctx, const char* src, char* dst, int srcSize, int dstCapacity, int level, const LZ4F_CDict* cdict)
|
||||||
{
|
{
|
||||||
int const acceleration = (level < -1) ? -level : 1;
|
int const acceleration = (level < -1) ? -level : 1;
|
||||||
LZ4F_initStream(ctx, cdict, level);
|
LZ4F_initStream(ctx, cdict, level, LZ4F_blockIndependent);
|
||||||
if (cdict) {
|
if (cdict) {
|
||||||
return LZ4_compress_fast_continue((LZ4_stream_t*)ctx, src, dst, srcSize, dstCapacity, acceleration);
|
return LZ4_compress_fast_continue((LZ4_stream_t*)ctx, src, dst, srcSize, dstCapacity, acceleration);
|
||||||
} else {
|
} else {
|
||||||
@ -732,7 +741,7 @@ static int LZ4F_compressBlock_continue(void* ctx, const char* src, char* dst, in
|
|||||||
|
|
||||||
static int LZ4F_compressBlockHC(void* ctx, const char* src, char* dst, int srcSize, int dstCapacity, int level, const LZ4F_CDict* cdict)
|
static int LZ4F_compressBlockHC(void* ctx, const char* src, char* dst, int srcSize, int dstCapacity, int level, const LZ4F_CDict* cdict)
|
||||||
{
|
{
|
||||||
LZ4F_initStream(ctx, cdict, level);
|
LZ4F_initStream(ctx, cdict, level, LZ4F_blockIndependent);
|
||||||
if (cdict) {
|
if (cdict) {
|
||||||
return LZ4_compress_HC_continue((LZ4_streamHC_t*)ctx, src, dst, srcSize, dstCapacity);
|
return LZ4_compress_HC_continue((LZ4_streamHC_t*)ctx, src, dst, srcSize, dstCapacity);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user