summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2013-03-15 19:47:11 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-03-22 12:12:22 +0100
commit49d7e71f77f899c05e4b5187e8834dfcbddf4505 (patch)
tree22ee00391c00aff5c27d18c3175689409b077014 /src/corelib/kernel
parentef502d4fb9a116ee9347092f6829127467d8181b (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.cpp10
-rw-r--r--src/corelib/kernel/qeventdispatcher_unix_p.h2
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