]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fixed complex tsan issue
authorYann Collet <cyan@fb.com>
Thu, 20 Sep 2018 20:47:31 +0000 (13:47 -0700)
committerYann Collet <cyan@fb.com>
Thu, 20 Sep 2018 20:47:31 +0000 (13:47 -0700)
when job->consumed == job->src.size , compression job is presumed completed,
so it must be the very last action done in worker thread.

lib/compress/zstdmt_compress.c

index a7e93dacdf1014983bd2d0da13dda2c18cf10b5b..a7c409c62358b6ee3b1a6fa1a8dc3f488142ed8e 100644 (file)
@@ -640,6 +640,7 @@ void ZSTDMT_compressionJob(void* jobDescription)
     ZSTD_CCtx* const cctx = ZSTDMT_getCCtx(job->cctxPool);
     rawSeqStore_t rawSeqStore = ZSTDMT_getSeq(job->seqPool);
     buffer_t dstBuff = job->dstBuff;
+    size_t lastCBlockSize = 0;
 
     /* ressources */
     if (cctx==NULL) {
@@ -739,11 +740,7 @@ void ZSTDMT_compressionJob(void* jobDescription)
                  ZSTD_compressEnd     (cctx, op, oend-op, ip, lastBlockSize) :
                  ZSTD_compressContinue(cctx, op, oend-op, ip, lastBlockSize);
             if (ZSTD_isError(cSize)) { job->cSize = cSize; goto _endJob; }
-            /* stats */
-            ZSTD_PTHREAD_MUTEX_LOCK(&job->job_mutex);
-            job->cSize += cSize;
-            job->consumed = job->src.size;
-            ZSTD_pthread_mutex_unlock(&job->job_mutex);
+            lastCBlockSize = cSize;
     }   }
 
 _endJob:
@@ -755,7 +752,12 @@ _endJob:
     ZSTDMT_releaseSeq(job->seqPool, rawSeqStore);
     ZSTDMT_releaseCCtx(job->cctxPool, cctx);
     /* report */
+    ZSTD_PTHREAD_MUTEX_LOCK(&job->job_mutex);
+    if (ZSTD_isError(job->cSize)) assert(lastCBlockSize == 0);
+    job->cSize += lastCBlockSize;
+    job->consumed = job->src.size;  /* when job->consumed == job->src.size , compression job is presumed completed */
     ZSTD_pthread_cond_signal(&job->job_cond);
+    ZSTD_pthread_mutex_unlock(&job->job_mutex);
 }