33 lines
1.3 KiB
Diff
33 lines
1.3 KiB
Diff
From c9bb0c30d0eab5ff7db80d920d40c02623732f71 Mon Sep 17 00:00:00 2001
|
|
From: Tom Stellard <tstellar@redhat.com>
|
|
Date: Tue, 9 Jun 2020 21:05:16 +0000
|
|
Subject: [PATCH] Fix data race in packageBinaries() function
|
|
|
|
The pkg variable used in the parallel loop was declared outside
|
|
of the omp parallel construct, so it was shared among tasks. This
|
|
had the potential to cause a data race. The gcc openmp implementation
|
|
did not hit this problem, but I uncovered it while trying to compile with
|
|
clang. My best guess as to what was happening is that after the last
|
|
task was launched, all tasks had the same value of pkg and were operating
|
|
on the same data at the same time.
|
|
|
|
This patch declares the variable inside the omp parallel construct, so each
|
|
task gets its own copy of the variable.
|
|
---
|
|
build/pack.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/build/pack.c b/build/pack.c
|
|
index 1f3d432bb3..8d6f74935e 100644
|
|
--- a/build/pack.c
|
|
+++ b/build/pack.c
|
|
@@ -765,7 +765,7 @@ rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
|
|
#pragma omp parallel
|
|
#pragma omp single
|
|
for (int i = 0; i < npkgs; i++) {
|
|
- pkg = tasks[i];
|
|
+ Package pkg = tasks[i];
|
|
#pragma omp task untied priority(i)
|
|
{
|
|
pkg->rc = packageBinary(spec, pkg, cookie, cheating, &pkg->filename);
|