From bf3a5ccef13d568662f027be62280aba1f73bada Mon Sep 17 00:00:00 2001 From: David Faure Date: Fri, 15 Mar 2013 19:47:46 +0100 Subject: 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 --- src/corelib/kernel/qeventdispatcher_glib.cpp | 5 +++-- src/corelib/kernel/qeventdispatcher_unix.cpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/corelib/kernel') diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp index 17830868da..e87e830c39 100644 --- a/src/corelib/kernel/qeventdispatcher_glib.cpp +++ b/src/corelib/kernel/qeventdispatcher_glib.cpp @@ -259,10 +259,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(s); - return (!data->canWait + return (!canWait || (source->serialNumber.load() != source->lastSerialNumber)); } diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp index ae220363ba..6ef8c5621e 100644 --- a/src/corelib/kernel/qeventdispatcher_unix.cpp +++ b/src/corelib/kernel/qeventdispatcher_unix.cpp @@ -589,7 +589,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.load() && (flags & QEventLoop::WaitForMoreEvents)); -- cgit v1.2.3