diff options
author | David Faure <david.faure@kdab.com> | 2013-03-15 18:47:46 (GMT) |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-04-23 08:24:01 (GMT) |
commit | 815d7f0ff36aa656ecfbf6a6d69fc9453d72e598 (patch) | |
tree | c32c8297422c1171f419aac136edd6d8969ecdb5 /src/corelib | |
parent | ea1521a490e6e6c2830eb8e072e80c554a91a439 (diff) | |
download | Qt-815d7f0ff36aa656ecfbf6a6d69fc9453d72e598.zip Qt-815d7f0ff36aa656ecfbf6a6d69fc9453d72e598.tar.gz Qt-815d7f0ff36aa656ecfbf6a6d69fc9453d72e598.tar.bz2 |
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>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_glib.cpp | 5 | ||||
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_unix.cpp | 2 | ||||
-rw-r--r-- | src/corelib/thread/qthread_p.h | 6 |
3 files changed, 10 insertions, 3 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp index 149c30d..0b0e308 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 abf1c29..dfceb05 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 766c62a..49cb80e 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; |