diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-12-24 10:33:07 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-12-24 10:33:07 +0100 |
commit | 751fa46df9bf06a1003df34b3e74c73c079e8626 (patch) | |
tree | 1de5e2588702bf8c29030fdfc55115caaa3ff2e2 /src/qml/qml | |
parent | 70004585f89f325f398c556d101bfa1833d87b53 (diff) | |
parent | d588ec795bf905d6d4a4827ad74f3d01315e40bf (diff) |
Merge "Merge remote-tracking branch 'origin/stable' into dev" into refs/staging/dev
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/ftw/qqmlthread.cpp | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/qml/qml/ftw/qqmlthread.cpp b/src/qml/qml/ftw/qqmlthread.cpp index 3accb9dce5..1ea3f25405 100644 --- a/src/qml/qml/ftw/qqmlthread.cpp +++ b/src/qml/qml/ftw/qqmlthread.cpp @@ -179,15 +179,17 @@ void QQmlThreadPrivate::threadEvent() { lock(); - if (m_shutdown) { - quit(); - wakeOne(); - unlock(); - q->shutdownThread(); - } else { - m_threadProcessing = true; + for (;;) { + if (m_shutdown) { + quit(); + wakeOne(); + unlock(); + q->shutdownThread(); + + return; + } else if (!threadList.isEmpty()) { + m_threadProcessing = true; - while (!threadList.isEmpty()) { QQmlThread::Message *message = threadList.first(); unlock(); @@ -197,13 +199,15 @@ void QQmlThreadPrivate::threadEvent() lock(); delete threadList.takeFirst(); - } + } else { + wakeOne(); - wakeOne(); + m_threadProcessing = false; - m_threadProcessing = false; + unlock(); - unlock(); + return; + } } } @@ -228,8 +232,11 @@ void QQmlThread::shutdown() d->lock(); Q_ASSERT(!d->m_shutdown); d->m_shutdown = true; - if (d->threadList.isEmpty() && d->m_threadProcessing == false) + if (d->threadList.isEmpty() && d->m_threadProcessing == false) { d->triggerThreadEvent(); + } else if (d->mainSync) { + d->wakeOne(); + } d->wait(); d->unlock(); d->QThread::wait(); @@ -333,8 +340,14 @@ void QQmlThread::internalCallMethodInMain(Message *message) d->triggerMainEvent(); } - while (d->mainSync && !d->m_shutdown) + while (d->mainSync) { + if (d->m_shutdown) { + delete d->mainSync; + d->mainSync = 0; + break; + } d->wait(); + } d->unlock(); } |