From 675d3548153223c6658fc4a84f252736846a0874 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Wed, 27 Aug 2014 15:40:42 +0200 Subject: [PATCH] Avoid deadlock when suspending device Don't wait for the GUI thread when it's already waiting for us. An application that uses the virtual keyboard may get an inputmethod query just when it is being suspended. If the GUI thread is already blocking on a semaphore at that point, waiting for the android thread, we really do not want to wait for the GUI thread... Task-number: QTBUG-40955 Change-Id: Iea2cf0dd058a41a897d596c4bcf16f0508adb20b Reviewed-by: Christian Stromme --- src/plugins/platforms/android/qandroidinputcontext.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index 5d47d2fda4..90eff615a2 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -45,6 +45,7 @@ #include "qandroidinputcontext.h" #include "androidjnimain.h" #include "androidjniinput.h" +#include "qandroideventdispatcher.h" #include #include #include @@ -995,8 +996,10 @@ Q_INVOKABLE QVariant QAndroidInputContext::queryFocusObjectUnsafe(Qt::InputMetho QVariant QAndroidInputContext::queryFocusObjectThreadSafe(Qt::InputMethodQuery query, QVariant argument) { - bool inMainThread = qGuiApp->thread() == QThread::currentThread(); + const bool inMainThread = qGuiApp->thread() == QThread::currentThread(); QVariant retval; + if (QAndroidEventDispatcherStopper::stopped() && !inMainThread) + return retval; QMetaObject::invokeMethod(this, "queryFocusObjectUnsafe", inMainThread ? Qt::DirectConnection : Qt::BlockingQueuedConnection, @@ -1010,12 +1013,15 @@ QVariant QAndroidInputContext::queryFocusObjectThreadSafe(Qt::InputMethodQuery q QSharedPointer QAndroidInputContext::focusObjectInputMethodQuery(Qt::InputMethodQueries queries) { #warning TODO make qGuiApp->focusObject() thread safe !!! + const bool inMainThread = qGuiApp->thread() == QThread::currentThread(); + if (QAndroidEventDispatcherStopper::stopped() && !inMainThread) + return QSharedPointer(); QObject *focusObject = qGuiApp->focusObject(); if (!focusObject) return QSharedPointer(); QSharedPointer ret = QSharedPointer(new QInputMethodQueryEvent(queries)); - if (qGuiApp->thread()==QThread::currentThread()) { + if (inMainThread) { QCoreApplication::sendEvent(focusObject, ret.data()); } else { QMetaObject::invokeMethod(this,