summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>2015-03-09 20:37:50 +0100
committerTor Arne Vestbø <tor.arne.vestbo@theqtcompany.com>2015-03-10 12:48:16 +0000
commitdfd6fc7bce67eaddf4333c65d8d160a6ca4a8e82 (patch)
treeeb49f82d5cbcd29b38430ea0529333cf52a8b175
parent4c542ab592ccd409639aed30f0a5efc965a3c3c1 (diff)
iOS: Only use root level native runloop if at first level of processEvents
We used to support calling QEventLoop::exec() from within a processEvent recursion and still jump down to the root native runloop, but this does not work as intended due to how QEventDispatcherCoreFoundation uses flags in its ProcessEventsState for e.g. deferred wake up or timer updates. The logic in QEventDispatcherCoreFoundation assumes that the next recursion to processEvents will be handled by itself, so that it can interpret the flags in ProcessEventsState. The iOS event dispatcher subclass, QIOSEventDispatcher, does neither of these things, and should only be used from a 'clean' state. Change-Id: I44fa156feecc45772806002465c35bef0797ead2 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@theqtcompany.com>
-rw-r--r--src/plugins/platforms/ios/qioseventdispatcher.h2
-rw-r--r--src/plugins/platforms/ios/qioseventdispatcher.mm20
2 files changed, 9 insertions, 13 deletions
diff --git a/src/plugins/platforms/ios/qioseventdispatcher.h b/src/plugins/platforms/ios/qioseventdispatcher.h
index 3a6b67f72e..fdaa7e68fe 100644
--- a/src/plugins/platforms/ios/qioseventdispatcher.h
+++ b/src/plugins/platforms/ios/qioseventdispatcher.h
@@ -52,7 +52,7 @@ public:
void interruptEventLoopExec();
private:
- uint m_processEventCallsAfterExec;
+ uint m_processEventLevel;
RunLoopObserver<QIOSEventDispatcher> m_runLoopExitObserver;
};
diff --git a/src/plugins/platforms/ios/qioseventdispatcher.mm b/src/plugins/platforms/ios/qioseventdispatcher.mm
index f4567f36f4..fc12e83a81 100644
--- a/src/plugins/platforms/ios/qioseventdispatcher.mm
+++ b/src/plugins/platforms/ios/qioseventdispatcher.mm
@@ -422,7 +422,7 @@ QT_USE_NAMESPACE
QIOSEventDispatcher::QIOSEventDispatcher(QObject *parent)
: QEventDispatcherCoreFoundation(parent)
- , m_processEventCallsAfterExec(0)
+ , m_processEventLevel(0)
, m_runLoopExitObserver(this, &QIOSEventDispatcher::handleRunLoopExit, kCFRunLoopExit)
{
}
@@ -439,8 +439,8 @@ bool __attribute__((returns_twice)) QIOSEventDispatcher::processEvents(QEventLoo
return false;
}
- if (!m_processEventCallsAfterExec && (flags & QEventLoop::EventLoopExec)) {
- ++m_processEventCallsAfterExec;
+ if (!m_processEventLevel && (flags & QEventLoop::EventLoopExec)) {
+ ++m_processEventLevel;
m_runLoopExitObserver.addToMode(kCFRunLoopCommonModes);
@@ -465,13 +465,9 @@ bool __attribute__((returns_twice)) QIOSEventDispatcher::processEvents(QEventLoo
Q_UNREACHABLE();
}
- if (m_processEventCallsAfterExec)
- ++m_processEventCallsAfterExec;
-
+ ++m_processEventLevel;
bool processedEvents = QEventDispatcherCoreFoundation::processEvents(flags);
-
- if (m_processEventCallsAfterExec)
- --m_processEventCallsAfterExec;
+ --m_processEventLevel;
return processedEvents;
}
@@ -481,7 +477,7 @@ void QIOSEventDispatcher::handleRunLoopExit(CFRunLoopActivity activity)
Q_UNUSED(activity);
Q_ASSERT(activity == kCFRunLoopExit);
- if (m_processEventCallsAfterExec == 1 && !QThreadData::current()->eventLoops.top()->isRunning()) {
+ if (m_processEventLevel == 1 && !QThreadData::current()->eventLoops.top()->isRunning()) {
qEventDispatcherDebug() << "Root runloop level exited";
interruptEventLoopExec();
}
@@ -489,9 +485,9 @@ void QIOSEventDispatcher::handleRunLoopExit(CFRunLoopActivity activity)
void QIOSEventDispatcher::interruptEventLoopExec()
{
- Q_ASSERT(m_processEventCallsAfterExec == 1);
+ Q_ASSERT(m_processEventLevel == 1);
- --m_processEventCallsAfterExec;
+ --m_processEventLevel;
m_runLoopExitObserver.removeFromMode(kCFRunLoopCommonModes);