diff options
author | David Faure <david.faure@kdab.com> | 2013-03-15 19:47:11 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-22 12:12:22 +0100 |
commit | 49d7e71f77f899c05e4b5187e8834dfcbddf4505 (patch) | |
tree | 22ee00391c00aff5c27d18c3175689409b077014 /src/corelib/kernel | |
parent | ef502d4fb9a116ee9347092f6829127467d8181b (diff) |
QEventDispatcherUNIX: turn interrupt bool into an atomic int.
It's read and written by different threads, so this was a race.
Change-Id: Ieffaa169eb67f40dc935291b3994f9ff1c7e05f0
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_unix.cpp | 10 | ||||
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_unix_p.h | 2 |
2 files changed, 5 insertions, 7 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp index c79fe89105..ae220363ba 100644 --- a/src/corelib/kernel/qeventdispatcher_unix.cpp +++ b/src/corelib/kernel/qeventdispatcher_unix.cpp @@ -147,8 +147,6 @@ QEventDispatcherUNIXPrivate::QEventDispatcherUNIXPrivate() qFatal("QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe"); sn_highest = -1; - - interrupt = false; } QEventDispatcherUNIXPrivate::~QEventDispatcherUNIXPrivate() @@ -584,7 +582,7 @@ int QEventDispatcherUNIX::activateSocketNotifiers() bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags) { Q_D(QEventDispatcherUNIX); - d->interrupt = false; + d->interrupt.store(0); // we are awake, broadcast it emit awake(); @@ -592,13 +590,13 @@ bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags) int nevents = 0; const bool canWait = (d->threadData->canWait - && !d->interrupt + && !d->interrupt.load() && (flags & QEventLoop::WaitForMoreEvents)); if (canWait) emit aboutToBlock(); - if (!d->interrupt) { + if (!d->interrupt.load()) { // return the maximum time we can wait for an event. timespec *tm = 0; timespec wait_tm = { 0l, 0l }; @@ -667,7 +665,7 @@ void QEventDispatcherUNIX::wakeUp() void QEventDispatcherUNIX::interrupt() { Q_D(QEventDispatcherUNIX); - d->interrupt = true; + d->interrupt.store(1); wakeUp(); } diff --git a/src/corelib/kernel/qeventdispatcher_unix_p.h b/src/corelib/kernel/qeventdispatcher_unix_p.h index db89b7c444..5d69d5e396 100644 --- a/src/corelib/kernel/qeventdispatcher_unix_p.h +++ b/src/corelib/kernel/qeventdispatcher_unix_p.h @@ -162,7 +162,7 @@ public: QSockNotType::List sn_pending_list; QAtomicInt wakeUps; - bool interrupt; + QAtomicInt interrupt; // bool }; QT_END_NAMESPACE |