1
0
mirror of https://github.com/facebook/zstd.git synced 2025-08-07 06:23:00 +03:00

seekable_format: Fix race in parallel_processing

There was no memory barrier between writing and reading `done`, which
would allow reordering to cause races. With so little data to handle
after each job completes, we might as well just join.
This commit is contained in:
Dave Vasilevsky
2025-05-07 00:10:10 -04:00
committed by Yann Collet
parent 6fc8455a72
commit 01c973de8d

View File

@@ -100,13 +100,11 @@ struct sum_job {
const char* fname;
unsigned long long sum;
unsigned frameNb;
int done;
};
static void sumFrame(void* opaque)
{
struct sum_job* job = (struct sum_job*)opaque;
job->done = 0;
FILE* const fin = fopen_orDie(job->fname, "rb");
@@ -128,7 +126,6 @@ static void sumFrame(void* opaque)
sum += data[i];
}
job->sum = sum;
job->done = 1;
fclose(fin);
ZSTD_seekable_free(seekable);
@@ -153,14 +150,14 @@ static void sumFile_orDie(const char* fname, int nbThreads)
unsigned fnb;
for (fnb = 0; fnb < numFrames; fnb++) {
jobs[fnb] = (struct sum_job){ fname, 0, fnb, 0 };
jobs[fnb] = (struct sum_job){ fname, 0, fnb };
POOL_add(pool, sumFrame, &jobs[fnb]);
}
POOL_joinJobs(pool);
unsigned long long total = 0;
for (fnb = 0; fnb < numFrames; fnb++) {
while (!jobs[fnb].done) SLEEP(5); /* wake up every 5 milliseconds to check */
total += jobs[fnb].sum;
}