From ad9f6bd1238a9eb9a49bceb2df1b31d44942fcda Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 12 Jan 2017 03:06:35 +0100 Subject: [PATCH] zstdmt : fix : resources properly collected even when early fail In previous version, main function would return early when detecting a job error. Late threads resources were therefore not collected back into pools. New version just register the error, but continue the collecting process. All buffers and context should be released back to pool before leaving main function. --- lib/compress/zstdmt_compress.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/compress/zstdmt_compress.c b/lib/compress/zstdmt_compress.c index 7e8bb9f3..24f5e5b8 100644 --- a/lib/compress/zstdmt_compress.c +++ b/lib/compress/zstdmt_compress.c @@ -305,7 +305,7 @@ size_t ZSTDMT_compressCCtx(ZSTDMT_CCtx* mtctx, /* note : since nbChunks <= nbThreads, all jobs should be running immediately in parallel */ { unsigned chunkID; - size_t dstPos = 0; + size_t error = 0, dstPos = 0; for (chunkID=0; chunkIDcctxPool, mtctx->jobs[chunkID].cctx); { size_t const cSize = mtctx->jobs[chunkID].cSize; - if (ZSTD_isError(cSize)) return cSize; /* leaving here : later ressources won't be released */ - if (dstPos + cSize > dstCapacity) return ERROR(dstSize_tooSmall); /* leaving here : later ressources won't be released */ + if (ZSTD_isError(cSize)) error = cSize; + if ((!error) && (dstPos + cSize > dstCapacity)) error = ERROR(dstSize_tooSmall); if (chunkID) { /* note : chunk 0 is already written directly into dst */ - memcpy((char*)dst + dstPos, mtctx->jobs[chunkID].dstBuff.start, cSize); + if (!error) memcpy((char*)dst + dstPos, mtctx->jobs[chunkID].dstBuff.start, cSize); ZSTDMT_releaseBuffer(mtctx->buffPool, mtctx->jobs[chunkID].dstBuff); } dstPos += cSize ; } } - DEBUGLOG(3, "compressed size : %u ", (U32)dstPos); - return dstPos; + if (!error) DEBUGLOG(3, "compressed size : %u ", (U32)dstPos); + return error ? error : dstPos; } }