Merge pull request #3786 from facebook/fix_flexarray_cctx
Remove FlexArray pattern from ZSTDMT
This commit is contained in:
@@ -178,6 +178,7 @@ static void ZSTD_freeCCtxContent(ZSTD_CCtx* cctx)
|
|||||||
|
|
||||||
size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx)
|
size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx)
|
||||||
{
|
{
|
||||||
|
DEBUGLOG(3, "ZSTD_freeCCtx (address: %p)", (void*)cctx);
|
||||||
if (cctx==NULL) return 0; /* support free on NULL */
|
if (cctx==NULL) return 0; /* support free on NULL */
|
||||||
RETURN_ERROR_IF(cctx->staticSize, memory_allocation,
|
RETURN_ERROR_IF(cctx->staticSize, memory_allocation,
|
||||||
"not compatible with static CCtx");
|
"not compatible with static CCtx");
|
||||||
|
|||||||
@@ -15,10 +15,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* ====== Constants ====== */
|
|
||||||
#define ZSTDMT_OVERLAPLOG_DEFAULT 0
|
|
||||||
|
|
||||||
|
|
||||||
/* ====== Dependencies ====== */
|
/* ====== Dependencies ====== */
|
||||||
#include "../common/allocations.h" /* ZSTD_customMalloc, ZSTD_customCalloc, ZSTD_customFree */
|
#include "../common/allocations.h" /* ZSTD_customMalloc, ZSTD_customCalloc, ZSTD_customFree */
|
||||||
#include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memset, INT_MAX, UINT_MAX */
|
#include "../common/zstd_deps.h" /* ZSTD_memcpy, ZSTD_memset, INT_MAX, UINT_MAX */
|
||||||
@@ -100,18 +96,39 @@ typedef struct ZSTDMT_bufferPool_s {
|
|||||||
unsigned totalBuffers;
|
unsigned totalBuffers;
|
||||||
unsigned nbBuffers;
|
unsigned nbBuffers;
|
||||||
ZSTD_customMem cMem;
|
ZSTD_customMem cMem;
|
||||||
buffer_t bTable[1]; /* variable size */
|
buffer_t* buffers;
|
||||||
} ZSTDMT_bufferPool;
|
} ZSTDMT_bufferPool;
|
||||||
|
|
||||||
|
static void ZSTDMT_freeBufferPool(ZSTDMT_bufferPool* bufPool)
|
||||||
|
{
|
||||||
|
unsigned u;
|
||||||
|
DEBUGLOG(3, "ZSTDMT_freeBufferPool (address:%08X)", (U32)(size_t)bufPool);
|
||||||
|
if (!bufPool) return; /* compatibility with free on NULL */
|
||||||
|
if (bufPool->buffers) {
|
||||||
|
for (u=0; u<bufPool->totalBuffers; u++) {
|
||||||
|
DEBUGLOG(4, "free buffer %2u (address:%08X)", u, (U32)(size_t)bufPool->buffers[u].start);
|
||||||
|
ZSTD_customFree(bufPool->buffers[u].start, bufPool->cMem);
|
||||||
|
}
|
||||||
|
ZSTD_customFree(bufPool->buffers, bufPool->cMem);
|
||||||
|
}
|
||||||
|
ZSTD_pthread_mutex_destroy(&bufPool->poolMutex);
|
||||||
|
ZSTD_customFree(bufPool, bufPool->cMem);
|
||||||
|
}
|
||||||
|
|
||||||
static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned maxNbBuffers, ZSTD_customMem cMem)
|
static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned maxNbBuffers, ZSTD_customMem cMem)
|
||||||
{
|
{
|
||||||
ZSTDMT_bufferPool* const bufPool = (ZSTDMT_bufferPool*)ZSTD_customCalloc(
|
ZSTDMT_bufferPool* const bufPool =
|
||||||
sizeof(ZSTDMT_bufferPool) + (maxNbBuffers-1) * sizeof(buffer_t), cMem);
|
(ZSTDMT_bufferPool*)ZSTD_customCalloc(sizeof(ZSTDMT_bufferPool), cMem);
|
||||||
if (bufPool==NULL) return NULL;
|
if (bufPool==NULL) return NULL;
|
||||||
if (ZSTD_pthread_mutex_init(&bufPool->poolMutex, NULL)) {
|
if (ZSTD_pthread_mutex_init(&bufPool->poolMutex, NULL)) {
|
||||||
ZSTD_customFree(bufPool, cMem);
|
ZSTD_customFree(bufPool, cMem);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
bufPool->buffers = (buffer_t*)ZSTD_customCalloc(maxNbBuffers * sizeof(buffer_t), cMem);
|
||||||
|
if (bufPool->buffers==NULL) {
|
||||||
|
ZSTDMT_freeBufferPool(bufPool);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
bufPool->bufferSize = 64 KB;
|
bufPool->bufferSize = 64 KB;
|
||||||
bufPool->totalBuffers = maxNbBuffers;
|
bufPool->totalBuffers = maxNbBuffers;
|
||||||
bufPool->nbBuffers = 0;
|
bufPool->nbBuffers = 0;
|
||||||
@@ -119,32 +136,19 @@ static ZSTDMT_bufferPool* ZSTDMT_createBufferPool(unsigned maxNbBuffers, ZSTD_cu
|
|||||||
return bufPool;
|
return bufPool;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ZSTDMT_freeBufferPool(ZSTDMT_bufferPool* bufPool)
|
|
||||||
{
|
|
||||||
unsigned u;
|
|
||||||
DEBUGLOG(3, "ZSTDMT_freeBufferPool (address:%08X)", (U32)(size_t)bufPool);
|
|
||||||
if (!bufPool) return; /* compatibility with free on NULL */
|
|
||||||
for (u=0; u<bufPool->totalBuffers; u++) {
|
|
||||||
DEBUGLOG(4, "free buffer %2u (address:%08X)", u, (U32)(size_t)bufPool->bTable[u].start);
|
|
||||||
ZSTD_customFree(bufPool->bTable[u].start, bufPool->cMem);
|
|
||||||
}
|
|
||||||
ZSTD_pthread_mutex_destroy(&bufPool->poolMutex);
|
|
||||||
ZSTD_customFree(bufPool, bufPool->cMem);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* only works at initialization, not during compression */
|
/* only works at initialization, not during compression */
|
||||||
static size_t ZSTDMT_sizeof_bufferPool(ZSTDMT_bufferPool* bufPool)
|
static size_t ZSTDMT_sizeof_bufferPool(ZSTDMT_bufferPool* bufPool)
|
||||||
{
|
{
|
||||||
size_t const poolSize = sizeof(*bufPool)
|
size_t const poolSize = sizeof(*bufPool);
|
||||||
+ (bufPool->totalBuffers - 1) * sizeof(buffer_t);
|
size_t const arraySize = bufPool->totalBuffers * sizeof(buffer_t);
|
||||||
unsigned u;
|
unsigned u;
|
||||||
size_t totalBufferSize = 0;
|
size_t totalBufferSize = 0;
|
||||||
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
|
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
|
||||||
for (u=0; u<bufPool->totalBuffers; u++)
|
for (u=0; u<bufPool->totalBuffers; u++)
|
||||||
totalBufferSize += bufPool->bTable[u].capacity;
|
totalBufferSize += bufPool->buffers[u].capacity;
|
||||||
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
|
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
|
||||||
|
|
||||||
return poolSize + totalBufferSize;
|
return poolSize + arraySize + totalBufferSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ZSTDMT_setBufferSize() :
|
/* ZSTDMT_setBufferSize() :
|
||||||
@@ -187,9 +191,9 @@ static buffer_t ZSTDMT_getBuffer(ZSTDMT_bufferPool* bufPool)
|
|||||||
DEBUGLOG(5, "ZSTDMT_getBuffer: bSize = %u", (U32)bufPool->bufferSize);
|
DEBUGLOG(5, "ZSTDMT_getBuffer: bSize = %u", (U32)bufPool->bufferSize);
|
||||||
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
|
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
|
||||||
if (bufPool->nbBuffers) { /* try to use an existing buffer */
|
if (bufPool->nbBuffers) { /* try to use an existing buffer */
|
||||||
buffer_t const buf = bufPool->bTable[--(bufPool->nbBuffers)];
|
buffer_t const buf = bufPool->buffers[--(bufPool->nbBuffers)];
|
||||||
size_t const availBufferSize = buf.capacity;
|
size_t const availBufferSize = buf.capacity;
|
||||||
bufPool->bTable[bufPool->nbBuffers] = g_nullBuffer;
|
bufPool->buffers[bufPool->nbBuffers] = g_nullBuffer;
|
||||||
if ((availBufferSize >= bSize) & ((availBufferSize>>3) <= bSize)) {
|
if ((availBufferSize >= bSize) & ((availBufferSize>>3) <= bSize)) {
|
||||||
/* large enough, but not too much */
|
/* large enough, but not too much */
|
||||||
DEBUGLOG(5, "ZSTDMT_getBuffer: provide buffer %u of size %u",
|
DEBUGLOG(5, "ZSTDMT_getBuffer: provide buffer %u of size %u",
|
||||||
@@ -250,14 +254,14 @@ static void ZSTDMT_releaseBuffer(ZSTDMT_bufferPool* bufPool, buffer_t buf)
|
|||||||
if (buf.start == NULL) return; /* compatible with release on NULL */
|
if (buf.start == NULL) return; /* compatible with release on NULL */
|
||||||
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
|
ZSTD_pthread_mutex_lock(&bufPool->poolMutex);
|
||||||
if (bufPool->nbBuffers < bufPool->totalBuffers) {
|
if (bufPool->nbBuffers < bufPool->totalBuffers) {
|
||||||
bufPool->bTable[bufPool->nbBuffers++] = buf; /* stored for later use */
|
bufPool->buffers[bufPool->nbBuffers++] = buf; /* stored for later use */
|
||||||
DEBUGLOG(5, "ZSTDMT_releaseBuffer: stored buffer of size %u in slot %u",
|
DEBUGLOG(5, "ZSTDMT_releaseBuffer: stored buffer of size %u in slot %u",
|
||||||
(U32)buf.capacity, (U32)(bufPool->nbBuffers-1));
|
(U32)buf.capacity, (U32)(bufPool->nbBuffers-1));
|
||||||
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
|
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
|
ZSTD_pthread_mutex_unlock(&bufPool->poolMutex);
|
||||||
/* Reached bufferPool capacity (should not happen) */
|
/* Reached bufferPool capacity (note: should not happen) */
|
||||||
DEBUGLOG(5, "ZSTDMT_releaseBuffer: pool capacity reached => freeing ");
|
DEBUGLOG(5, "ZSTDMT_releaseBuffer: pool capacity reached => freeing ");
|
||||||
ZSTD_customFree(buf.start, bufPool->cMem);
|
ZSTD_customFree(buf.start, bufPool->cMem);
|
||||||
}
|
}
|
||||||
@@ -350,16 +354,20 @@ typedef struct {
|
|||||||
int totalCCtx;
|
int totalCCtx;
|
||||||
int availCCtx;
|
int availCCtx;
|
||||||
ZSTD_customMem cMem;
|
ZSTD_customMem cMem;
|
||||||
ZSTD_CCtx* cctx[1]; /* variable size */
|
ZSTD_CCtx** cctxs;
|
||||||
} ZSTDMT_CCtxPool;
|
} ZSTDMT_CCtxPool;
|
||||||
|
|
||||||
/* note : all CCtx borrowed from the pool should be released back to the pool _before_ freeing the pool */
|
/* note : all CCtx borrowed from the pool must be reverted back to the pool _before_ freeing the pool */
|
||||||
static void ZSTDMT_freeCCtxPool(ZSTDMT_CCtxPool* pool)
|
static void ZSTDMT_freeCCtxPool(ZSTDMT_CCtxPool* pool)
|
||||||
{
|
{
|
||||||
int cid;
|
int cid;
|
||||||
for (cid=0; cid<pool->totalCCtx; cid++)
|
if (!pool) return;
|
||||||
ZSTD_freeCCtx(pool->cctx[cid]); /* note : compatible with free on NULL */
|
|
||||||
ZSTD_pthread_mutex_destroy(&pool->poolMutex);
|
ZSTD_pthread_mutex_destroy(&pool->poolMutex);
|
||||||
|
if (pool->cctxs) {
|
||||||
|
for (cid=0; cid<pool->totalCCtx; cid++)
|
||||||
|
ZSTD_freeCCtx(pool->cctxs[cid]); /* free compatible with NULL */
|
||||||
|
ZSTD_customFree(pool->cctxs, pool->cMem);
|
||||||
|
}
|
||||||
ZSTD_customFree(pool, pool->cMem);
|
ZSTD_customFree(pool, pool->cMem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,19 +376,24 @@ static void ZSTDMT_freeCCtxPool(ZSTDMT_CCtxPool* pool)
|
|||||||
static ZSTDMT_CCtxPool* ZSTDMT_createCCtxPool(int nbWorkers,
|
static ZSTDMT_CCtxPool* ZSTDMT_createCCtxPool(int nbWorkers,
|
||||||
ZSTD_customMem cMem)
|
ZSTD_customMem cMem)
|
||||||
{
|
{
|
||||||
ZSTDMT_CCtxPool* const cctxPool = (ZSTDMT_CCtxPool*) ZSTD_customCalloc(
|
ZSTDMT_CCtxPool* const cctxPool =
|
||||||
sizeof(ZSTDMT_CCtxPool) + (nbWorkers-1)*sizeof(ZSTD_CCtx*), cMem);
|
(ZSTDMT_CCtxPool*) ZSTD_customCalloc(sizeof(ZSTDMT_CCtxPool), cMem);
|
||||||
assert(nbWorkers > 0);
|
assert(nbWorkers > 0);
|
||||||
if (!cctxPool) return NULL;
|
if (!cctxPool) return NULL;
|
||||||
if (ZSTD_pthread_mutex_init(&cctxPool->poolMutex, NULL)) {
|
if (ZSTD_pthread_mutex_init(&cctxPool->poolMutex, NULL)) {
|
||||||
ZSTD_customFree(cctxPool, cMem);
|
ZSTD_customFree(cctxPool, cMem);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
cctxPool->cMem = cMem;
|
|
||||||
cctxPool->totalCCtx = nbWorkers;
|
cctxPool->totalCCtx = nbWorkers;
|
||||||
|
cctxPool->cctxs = (ZSTD_CCtx**)ZSTD_customCalloc(nbWorkers * sizeof(ZSTD_CCtx*), cMem);
|
||||||
|
if (!cctxPool->cctxs) {
|
||||||
|
ZSTDMT_freeCCtxPool(cctxPool);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
cctxPool->cMem = cMem;
|
||||||
|
cctxPool->cctxs[0] = ZSTD_createCCtx_advanced(cMem);
|
||||||
|
if (!cctxPool->cctxs[0]) { ZSTDMT_freeCCtxPool(cctxPool); return NULL; }
|
||||||
cctxPool->availCCtx = 1; /* at least one cctx for single-thread mode */
|
cctxPool->availCCtx = 1; /* at least one cctx for single-thread mode */
|
||||||
cctxPool->cctx[0] = ZSTD_createCCtx_advanced(cMem);
|
|
||||||
if (!cctxPool->cctx[0]) { ZSTDMT_freeCCtxPool(cctxPool); return NULL; }
|
|
||||||
DEBUGLOG(3, "cctxPool created, with %u workers", nbWorkers);
|
DEBUGLOG(3, "cctxPool created, with %u workers", nbWorkers);
|
||||||
return cctxPool;
|
return cctxPool;
|
||||||
}
|
}
|
||||||
@@ -402,16 +415,16 @@ static size_t ZSTDMT_sizeof_CCtxPool(ZSTDMT_CCtxPool* cctxPool)
|
|||||||
{
|
{
|
||||||
ZSTD_pthread_mutex_lock(&cctxPool->poolMutex);
|
ZSTD_pthread_mutex_lock(&cctxPool->poolMutex);
|
||||||
{ unsigned const nbWorkers = cctxPool->totalCCtx;
|
{ unsigned const nbWorkers = cctxPool->totalCCtx;
|
||||||
size_t const poolSize = sizeof(*cctxPool)
|
size_t const poolSize = sizeof(*cctxPool);
|
||||||
+ (nbWorkers-1) * sizeof(ZSTD_CCtx*);
|
size_t const arraySize = cctxPool->totalCCtx * sizeof(ZSTD_CCtx*);
|
||||||
unsigned u;
|
|
||||||
size_t totalCCtxSize = 0;
|
size_t totalCCtxSize = 0;
|
||||||
|
unsigned u;
|
||||||
for (u=0; u<nbWorkers; u++) {
|
for (u=0; u<nbWorkers; u++) {
|
||||||
totalCCtxSize += ZSTD_sizeof_CCtx(cctxPool->cctx[u]);
|
totalCCtxSize += ZSTD_sizeof_CCtx(cctxPool->cctxs[u]);
|
||||||
}
|
}
|
||||||
ZSTD_pthread_mutex_unlock(&cctxPool->poolMutex);
|
ZSTD_pthread_mutex_unlock(&cctxPool->poolMutex);
|
||||||
assert(nbWorkers > 0);
|
assert(nbWorkers > 0);
|
||||||
return poolSize + totalCCtxSize;
|
return poolSize + arraySize + totalCCtxSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,7 +434,7 @@ static ZSTD_CCtx* ZSTDMT_getCCtx(ZSTDMT_CCtxPool* cctxPool)
|
|||||||
ZSTD_pthread_mutex_lock(&cctxPool->poolMutex);
|
ZSTD_pthread_mutex_lock(&cctxPool->poolMutex);
|
||||||
if (cctxPool->availCCtx) {
|
if (cctxPool->availCCtx) {
|
||||||
cctxPool->availCCtx--;
|
cctxPool->availCCtx--;
|
||||||
{ ZSTD_CCtx* const cctx = cctxPool->cctx[cctxPool->availCCtx];
|
{ ZSTD_CCtx* const cctx = cctxPool->cctxs[cctxPool->availCCtx];
|
||||||
ZSTD_pthread_mutex_unlock(&cctxPool->poolMutex);
|
ZSTD_pthread_mutex_unlock(&cctxPool->poolMutex);
|
||||||
return cctx;
|
return cctx;
|
||||||
} }
|
} }
|
||||||
@@ -435,7 +448,7 @@ static void ZSTDMT_releaseCCtx(ZSTDMT_CCtxPool* pool, ZSTD_CCtx* cctx)
|
|||||||
if (cctx==NULL) return; /* compatibility with release on NULL */
|
if (cctx==NULL) return; /* compatibility with release on NULL */
|
||||||
ZSTD_pthread_mutex_lock(&pool->poolMutex);
|
ZSTD_pthread_mutex_lock(&pool->poolMutex);
|
||||||
if (pool->availCCtx < pool->totalCCtx)
|
if (pool->availCCtx < pool->totalCCtx)
|
||||||
pool->cctx[pool->availCCtx++] = cctx;
|
pool->cctxs[pool->availCCtx++] = cctx;
|
||||||
else {
|
else {
|
||||||
/* pool overflow : should not happen, since totalCCtx==nbWorkers */
|
/* pool overflow : should not happen, since totalCCtx==nbWorkers */
|
||||||
DEBUGLOG(4, "CCtx pool overflow : free cctx");
|
DEBUGLOG(4, "CCtx pool overflow : free cctx");
|
||||||
|
|||||||
+8
-6
@@ -1119,6 +1119,9 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
|||||||
size_t const srcSize1 = kWindowSize / 2;
|
size_t const srcSize1 = kWindowSize / 2;
|
||||||
size_t const srcSize2 = kWindowSize * 10;
|
size_t const srcSize2 = kWindowSize * 10;
|
||||||
|
|
||||||
|
CHECK(cctx!=NULL);
|
||||||
|
CHECK(dctx!=NULL);
|
||||||
|
CHECK(dict!=NULL);
|
||||||
if (CNBuffSize < dictSize) goto _output_error;
|
if (CNBuffSize < dictSize) goto _output_error;
|
||||||
|
|
||||||
RDG_genBuffer(dict, dictSize, 0.5, 0.5, seed);
|
RDG_genBuffer(dict, dictSize, 0.5, 0.5, seed);
|
||||||
@@ -1140,6 +1143,7 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
|||||||
cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, srcSize1);
|
cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, srcSize1);
|
||||||
CHECK_Z(cSize);
|
CHECK_Z(cSize);
|
||||||
CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dict, dictSize));
|
CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dict, dictSize));
|
||||||
|
|
||||||
cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, srcSize2);
|
cSize = ZSTD_compress2(cctx, compressedBuffer, compressedBufferSize, CNBuffer, srcSize2);
|
||||||
/* Streaming decompression to catch out of bounds offsets. */
|
/* Streaming decompression to catch out of bounds offsets. */
|
||||||
{
|
{
|
||||||
@@ -1153,24 +1157,22 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
|||||||
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 2));
|
CHECK_Z(ZSTD_CCtx_setParameter(cctx, ZSTD_c_nbWorkers, 2));
|
||||||
/* Round trip once with a dictionary. */
|
/* Round trip once with a dictionary. */
|
||||||
CHECK_Z(ZSTD_CCtx_refPrefix(cctx, dict, dictSize));
|
CHECK_Z(ZSTD_CCtx_refPrefix(cctx, dict, dictSize));
|
||||||
{
|
{ ZSTD_inBuffer in = {CNBuffer, srcSize1, 0};
|
||||||
ZSTD_inBuffer in = {CNBuffer, srcSize1, 0};
|
|
||||||
ZSTD_outBuffer out = {compressedBuffer, compressedBufferSize, 0};
|
ZSTD_outBuffer out = {compressedBuffer, compressedBufferSize, 0};
|
||||||
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush));
|
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush));
|
||||||
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end));
|
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end));
|
||||||
cSize = out.pos;
|
cSize = out.pos;
|
||||||
}
|
}
|
||||||
CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dict, dictSize));
|
CHECK_Z(ZSTD_decompress_usingDict(dctx, decodedBuffer, CNBuffSize, compressedBuffer, cSize, dict, dictSize));
|
||||||
{
|
|
||||||
ZSTD_inBuffer in = {CNBuffer, srcSize2, 0};
|
{ ZSTD_inBuffer in = {CNBuffer, srcSize2, 0};
|
||||||
ZSTD_outBuffer out = {compressedBuffer, compressedBufferSize, 0};
|
ZSTD_outBuffer out = {compressedBuffer, compressedBufferSize, 0};
|
||||||
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush));
|
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_flush));
|
||||||
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end));
|
CHECK_Z(ZSTD_compressStream2(cctx, &out, &in, ZSTD_e_end));
|
||||||
cSize = out.pos;
|
cSize = out.pos;
|
||||||
}
|
}
|
||||||
/* Streaming decompression to catch out of bounds offsets. */
|
/* Streaming decompression to catch out of bounds offsets. */
|
||||||
{
|
{ ZSTD_inBuffer in = {compressedBuffer, cSize, 0};
|
||||||
ZSTD_inBuffer in = {compressedBuffer, cSize, 0};
|
|
||||||
ZSTD_outBuffer out = {decodedBuffer, CNBuffSize, 0};
|
ZSTD_outBuffer out = {decodedBuffer, CNBuffSize, 0};
|
||||||
size_t const dSize = ZSTD_decompressStream(dctx, &out, &in);
|
size_t const dSize = ZSTD_decompressStream(dctx, &out, &in);
|
||||||
CHECK_Z(dSize);
|
CHECK_Z(dSize);
|
||||||
|
|||||||
Reference in New Issue
Block a user