summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2013-03-15 19:47:46 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-04-23 10:24:01 +0200
commit815d7f0ff36aa656ecfbf6a6d69fc9453d72e598 (patch)
treec32c8297422c1171f419aac136edd6d8969ecdb5
parentea1521a490e6e6c2830eb8e072e80c554a91a439 (diff)
downloadqt4-tools-815d7f0ff36aa656ecfbf6a6d69fc9453d72e598.tar.gz
QThreadDataPrivate: fix data race on canWait boolean.
postEvent() accesses it with the postEventList mutex locked, but processEvent() was checking it without any mutex locked. Change-Id: I31bbb50f7a1c337067b8e3de16ee7cd11400b517 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from qtbase/bf3a5ccef13d568662f027be62280aba1f73bada) Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
-rw-r--r--src/corelib/kernel/qeventdispatcher_glib.cpp5
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix.cpp2
-rw-r--r--src/corelib/thread/qthread_p.h6
3 files changed, 10 insertions, 3 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp
index 149c30d866..0b0e3083aa 100644
--- a/src/corelib/kernel/qeventdispatcher_glib.cpp
+++ b/src/corelib/kernel/qeventdispatcher_glib.cpp
@@ -260,10 +260,11 @@ static gboolean postEventSourcePrepare(GSource *s, gint *timeout)
gint dummy;
if (!timeout)
timeout = &dummy;
- *timeout = data->canWait ? -1 : 0;
+ const bool canWait = data->canWaitLocked();
+ *timeout = canWait ? -1 : 0;
GPostEventSource *source = reinterpret_cast<GPostEventSource *>(s);
- return (!data->canWait
+ return (!canWait
|| (source->serialNumber != source->lastSerialNumber));
}
diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp
index abf1c29c40..dfceb057d8 100644
--- a/src/corelib/kernel/qeventdispatcher_unix.cpp
+++ b/src/corelib/kernel/qeventdispatcher_unix.cpp
@@ -908,7 +908,7 @@ bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags)
QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData);
int nevents = 0;
- const bool canWait = (d->threadData->canWait
+ const bool canWait = (d->threadData->canWaitLocked()
&& !d->interrupt
&& (flags & QEventLoop::WaitForMoreEvents));
diff --git a/src/corelib/thread/qthread_p.h b/src/corelib/thread/qthread_p.h
index 766c62aef5..49cb80e233 100644
--- a/src/corelib/thread/qthread_p.h
+++ b/src/corelib/thread/qthread_p.h
@@ -222,6 +222,12 @@ public:
void ref();
void deref();
+ bool canWaitLocked()
+ {
+ QMutexLocker locker(&postEventList.mutex);
+ return canWait;
+ }
+
QThread *thread;
Qt::HANDLE threadId;
bool quitNow;