Merge branch 'advancedAPI2' of github.com:facebook/zstd into advancedAPI2
This commit is contained in:
commit
f45ca527a1
@ -718,7 +718,8 @@ size_t ZSTD_CDict_loadDictionary(ZSTD_CDict* cdict, const void* dict, size_t dic
|
|||||||
@return : pointer to ZSTD_DCtx*, or NULL if error (size too small)
|
@return : pointer to ZSTD_DCtx*, or NULL if error (size too small)
|
||||||
Note : zstd will never resize nor malloc() when using a static dctx.
|
Note : zstd will never resize nor malloc() when using a static dctx.
|
||||||
If it needs more memory than available, it will simply error out.
|
If it needs more memory than available, it will simply error out.
|
||||||
Note 2 : there is no corresponding "free" function.
|
Note 2 : static dctx is incompatible with legacy support
|
||||||
|
Note 3 : there is no corresponding "free" function.
|
||||||
Since workspace was allocated externally, it must be freed externally.
|
Since workspace was allocated externally, it must be freed externally.
|
||||||
Limitation : currently not compatible with internal DDict creation,
|
Limitation : currently not compatible with internal DDict creation,
|
||||||
such as ZSTD_initDStream_usingDict().
|
such as ZSTD_initDStream_usingDict().
|
||||||
|
@ -271,6 +271,7 @@ _endJob:
|
|||||||
|
|
||||||
struct ZSTDMT_CCtx_s {
|
struct ZSTDMT_CCtx_s {
|
||||||
POOL_ctx* factory;
|
POOL_ctx* factory;
|
||||||
|
ZSTDMT_jobDescription* jobs;
|
||||||
ZSTDMT_bufferPool* buffPool;
|
ZSTDMT_bufferPool* buffPool;
|
||||||
ZSTDMT_CCtxPool* cctxPool;
|
ZSTDMT_CCtxPool* cctxPool;
|
||||||
pthread_mutex_t jobCompleted_mutex;
|
pthread_mutex_t jobCompleted_mutex;
|
||||||
@ -294,10 +295,9 @@ struct ZSTDMT_CCtx_s {
|
|||||||
size_t sectionSize;
|
size_t sectionSize;
|
||||||
ZSTD_CDict* cdict;
|
ZSTD_CDict* cdict;
|
||||||
ZSTD_CStream* cstream;
|
ZSTD_CStream* cstream;
|
||||||
ZSTDMT_jobDescription jobs[1]; /* variable size (must lies at the end) */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ZSTDMT_CCtx *ZSTDMT_createCCtx(unsigned nbThreads)
|
ZSTDMT_CCtx* ZSTDMT_createCCtx(unsigned nbThreads)
|
||||||
{
|
{
|
||||||
ZSTDMT_CCtx* cctx;
|
ZSTDMT_CCtx* cctx;
|
||||||
U32 const minNbJobs = nbThreads + 2;
|
U32 const minNbJobs = nbThreads + 2;
|
||||||
@ -306,7 +306,7 @@ ZSTDMT_CCtx *ZSTDMT_createCCtx(unsigned nbThreads)
|
|||||||
DEBUGLOG(5, "nbThreads : %u ; minNbJobs : %u ; nbJobsLog2 : %u ; nbJobs : %u \n",
|
DEBUGLOG(5, "nbThreads : %u ; minNbJobs : %u ; nbJobsLog2 : %u ; nbJobs : %u \n",
|
||||||
nbThreads, minNbJobs, nbJobsLog2, nbJobs);
|
nbThreads, minNbJobs, nbJobsLog2, nbJobs);
|
||||||
if ((nbThreads < 1) | (nbThreads > ZSTDMT_NBTHREADS_MAX)) return NULL;
|
if ((nbThreads < 1) | (nbThreads > ZSTDMT_NBTHREADS_MAX)) return NULL;
|
||||||
cctx = (ZSTDMT_CCtx*) calloc(1, sizeof(ZSTDMT_CCtx) + nbJobs*sizeof(ZSTDMT_jobDescription));
|
cctx = (ZSTDMT_CCtx*) calloc(1, sizeof(ZSTDMT_CCtx));
|
||||||
if (!cctx) return NULL;
|
if (!cctx) return NULL;
|
||||||
cctx->nbThreads = nbThreads;
|
cctx->nbThreads = nbThreads;
|
||||||
cctx->jobIDMask = nbJobs - 1;
|
cctx->jobIDMask = nbJobs - 1;
|
||||||
@ -314,9 +314,10 @@ ZSTDMT_CCtx *ZSTDMT_createCCtx(unsigned nbThreads)
|
|||||||
cctx->sectionSize = 0;
|
cctx->sectionSize = 0;
|
||||||
cctx->overlapRLog = 3;
|
cctx->overlapRLog = 3;
|
||||||
cctx->factory = POOL_create(nbThreads, 1);
|
cctx->factory = POOL_create(nbThreads, 1);
|
||||||
|
cctx->jobs = (ZSTDMT_jobDescription*) malloc(nbJobs * sizeof(*cctx->jobs));
|
||||||
cctx->buffPool = ZSTDMT_createBufferPool(nbThreads);
|
cctx->buffPool = ZSTDMT_createBufferPool(nbThreads);
|
||||||
cctx->cctxPool = ZSTDMT_createCCtxPool(nbThreads);
|
cctx->cctxPool = ZSTDMT_createCCtxPool(nbThreads);
|
||||||
if (!cctx->factory | !cctx->buffPool | !cctx->cctxPool) { /* one object was not created */
|
if (!cctx->factory | !cctx->jobs | !cctx->buffPool | !cctx->cctxPool) {
|
||||||
ZSTDMT_freeCCtx(cctx);
|
ZSTDMT_freeCCtx(cctx);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -356,6 +357,7 @@ size_t ZSTDMT_freeCCtx(ZSTDMT_CCtx* mtctx)
|
|||||||
POOL_free(mtctx->factory);
|
POOL_free(mtctx->factory);
|
||||||
if (!mtctx->allJobsCompleted) ZSTDMT_releaseAllJobResources(mtctx); /* stop workers first */
|
if (!mtctx->allJobsCompleted) ZSTDMT_releaseAllJobResources(mtctx); /* stop workers first */
|
||||||
ZSTDMT_freeBufferPool(mtctx->buffPool); /* release job resources into pools first */
|
ZSTDMT_freeBufferPool(mtctx->buffPool); /* release job resources into pools first */
|
||||||
|
free(mtctx->jobs);
|
||||||
ZSTDMT_freeCCtxPool(mtctx->cctxPool);
|
ZSTDMT_freeCCtxPool(mtctx->cctxPool);
|
||||||
ZSTD_freeCDict(mtctx->cdict);
|
ZSTD_freeCDict(mtctx->cdict);
|
||||||
ZSTD_freeCStream(mtctx->cstream);
|
ZSTD_freeCStream(mtctx->cstream);
|
||||||
@ -491,7 +493,8 @@ size_t ZSTDMT_compressCCtx(ZSTDMT_CCtx* mtctx,
|
|||||||
/* ======= Streaming API ======= */
|
/* ======= Streaming API ======= */
|
||||||
/* ====================================== */
|
/* ====================================== */
|
||||||
|
|
||||||
static void ZSTDMT_waitForAllJobsCompleted(ZSTDMT_CCtx* zcs) {
|
static void ZSTDMT_waitForAllJobsCompleted(ZSTDMT_CCtx* zcs)
|
||||||
|
{
|
||||||
while (zcs->doneJobID < zcs->nextJobID) {
|
while (zcs->doneJobID < zcs->nextJobID) {
|
||||||
unsigned const jobID = zcs->doneJobID & zcs->jobIDMask;
|
unsigned const jobID = zcs->doneJobID & zcs->jobIDMask;
|
||||||
PTHREAD_MUTEX_LOCK(&zcs->jobCompleted_mutex);
|
PTHREAD_MUTEX_LOCK(&zcs->jobCompleted_mutex);
|
||||||
|
@ -1586,6 +1586,8 @@ static size_t ZSTD_decompressMultiFrame(ZSTD_DCtx* dctx,
|
|||||||
size_t decodedSize;
|
size_t decodedSize;
|
||||||
size_t const frameSize = ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
|
size_t const frameSize = ZSTD_findFrameCompressedSizeLegacy(src, srcSize);
|
||||||
if (ZSTD_isError(frameSize)) return frameSize;
|
if (ZSTD_isError(frameSize)) return frameSize;
|
||||||
|
/* legacy support is incompatible with static dctx */
|
||||||
|
if (dctx->staticSize) return ERROR(memory_allocation);
|
||||||
|
|
||||||
decodedSize = ZSTD_decompressLegacy(dst, dstCapacity, src, frameSize, dict, dictSize);
|
decodedSize = ZSTD_decompressLegacy(dst, dstCapacity, src, frameSize, dict, dictSize);
|
||||||
|
|
||||||
@ -2258,8 +2260,11 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|||||||
U32 someMoreWork = 1;
|
U32 someMoreWork = 1;
|
||||||
|
|
||||||
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
|
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
|
||||||
if (zds->legacyVersion)
|
if (zds->legacyVersion) {
|
||||||
|
/* legacy support is incompatible with static dctx */
|
||||||
|
if (zds->staticSize) return ERROR(memory_allocation);
|
||||||
return ZSTD_decompressLegacyStream(zds->legacyContext, zds->legacyVersion, output, input);
|
return ZSTD_decompressLegacyStream(zds->legacyContext, zds->legacyVersion, output, input);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (someMoreWork) {
|
while (someMoreWork) {
|
||||||
@ -2277,6 +2282,8 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|||||||
if (legacyVersion) {
|
if (legacyVersion) {
|
||||||
const void* const dict = zds->ddict ? zds->ddict->dictContent : NULL;
|
const void* const dict = zds->ddict ? zds->ddict->dictContent : NULL;
|
||||||
size_t const dictSize = zds->ddict ? zds->ddict->dictSize : 0;
|
size_t const dictSize = zds->ddict ? zds->ddict->dictSize : 0;
|
||||||
|
/* legacy support is incompatible with static dctx */
|
||||||
|
if (zds->staticSize) return ERROR(memory_allocation);
|
||||||
CHECK_F(ZSTD_initLegacyStream(&zds->legacyContext, zds->previousLegacyVersion, legacyVersion,
|
CHECK_F(ZSTD_initLegacyStream(&zds->legacyContext, zds->previousLegacyVersion, legacyVersion,
|
||||||
dict, dictSize));
|
dict, dictSize));
|
||||||
zds->legacyVersion = zds->previousLegacyVersion = legacyVersion;
|
zds->legacyVersion = zds->previousLegacyVersion = legacyVersion;
|
||||||
|
@ -844,7 +844,8 @@ ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem);
|
|||||||
* @return : pointer to ZSTD_DCtx*, or NULL if error (size too small)
|
* @return : pointer to ZSTD_DCtx*, or NULL if error (size too small)
|
||||||
* Note : zstd will never resize nor malloc() when using a static dctx.
|
* Note : zstd will never resize nor malloc() when using a static dctx.
|
||||||
* If it needs more memory than available, it will simply error out.
|
* If it needs more memory than available, it will simply error out.
|
||||||
* Note 2 : there is no corresponding "free" function.
|
* Note 2 : static dctx is incompatible with legacy support
|
||||||
|
* Note 3 : there is no corresponding "free" function.
|
||||||
* Since workspace was allocated externally, it must be freed externally.
|
* Since workspace was allocated externally, it must be freed externally.
|
||||||
* Limitation : currently not compatible with internal DDict creation,
|
* Limitation : currently not compatible with internal DDict creation,
|
||||||
* such as ZSTD_initDStream_usingDict().
|
* such as ZSTD_initDStream_usingDict().
|
||||||
|
Loading…
x
Reference in New Issue
Block a user