[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kdelibs/frameworks] tier1/threadweaver/src/Weaver: Fix race: helgrind says d->elements is accessed
From: David Faure <faure () kde ! org>
Date: 2013-10-27 17:56:35
Message-ID: E1VaUZn-0005xI-Pu () scm ! kde ! org
[Download RAW message or body]
Git commit a42c608f2fb7d13d6040afa2abb1cd8e28f199c6 by David Faure.
Committed on 27/10/2013 at 17:54.
Pushed by dfaure into branch 'frameworks'.
Fix race: helgrind says d->elements is accessed from multiple threads.
-> move mutex before std::find, and lock mutex before std::find in
the other method, in release mode.
M +4 -1 tier1/threadweaver/src/Weaver/JobCollection.cpp
http://commits.kde.org/kdelibs/a42c608f2fb7d13d6040afa2abb1cd8e28f199c6
diff --git a/tier1/threadweaver/src/Weaver/JobCollection.cpp \
b/tier1/threadweaver/src/Weaver/JobCollection.cpp index 3dffb58..3bd3992 100644
--- a/tier1/threadweaver/src/Weaver/JobCollection.cpp
+++ b/tier1/threadweaver/src/Weaver/JobCollection.cpp
@@ -196,8 +196,11 @@ void JobCollection::run(JobPointer, Thread*)
void JobCollection::elementStarted(JobPointer job, Thread* thread)
{
Q_UNUSED(job) // except in Q_ASSERT
+#ifndef NDEBUG // to avoid the mutex in release mode
Q_ASSERT(!d->self.isNull());
+ QMutexLocker l(mutex()); Q_UNUSED(l);
Q_ASSERT(job.data() == d->self || std::find(d->elements.begin(), \
d->elements.end(), job) != d->elements.end()); +#endif
if (d->jobsStarted.fetchAndAddOrdered(1) == 0) {
//emit started() signal on beginning of first job execution
executor()->defaultBegin(d->self, thread);
@@ -208,8 +211,8 @@ void JobCollection::elementFinished(JobPointer job, Thread \
*thread) {
Q_UNUSED(job) // except in Q_ASSERT
Q_ASSERT(!d->self.isNull());
- Q_ASSERT(job.data() == d->self || std::find(d->elements.begin(), \
d->elements.end(), job) != d->elements.end()); QMutexLocker l(mutex()); Q_UNUSED(l);
+ Q_ASSERT(job.data() == d->self || std::find(d->elements.begin(), \
d->elements.end(), job) != d->elements.end()); const int jobsStarted = \
d->jobsStarted.loadAcquire(); Q_ASSERT(jobsStarted >=0); Q_UNUSED(jobsStarted);
const int remainingJobs = d->jobCounter.fetchAndAddOrdered(-1) -1;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic