diff options
author | Tarja Sundqvist <[email protected]> | 2024-05-08 08:15:08 +0300 |
---|---|---|
committer | Tarja Sundqvist <[email protected]> | 2024-05-08 08:15:08 +0300 |
commit | bbb1891595aba23ff3c6d137aa74442f9e54479b (patch) | |
tree | fca0f8d8732a0c5838c60e561353126532ef04d6 | |
parent | 3d9289d73c5c03ed5b2fe246589d0d81cfdaa22e (diff) | |
parent | 0c6d4d574721b70637617884f6afc261e852683b (diff) |
Merge remote-tracking branch 'origin/tqtc/lts-5.15.14' into tqtc/lts-5.15-opensourcev5.15.14-lts-lgpl
Change-Id: I6a0402cd1c4df0733479e52a381526f0b5e75837
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java | 18 | ||||
-rw-r--r-- | src/plugins/android/qandroidwebview.cpp | 18 |
3 files changed, 32 insertions, 6 deletions
diff --git a/.qmake.conf b/.qmake.conf index 3b6b32b..0c1760f 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -2,4 +2,4 @@ load(qt_build_config) DEFINES += QT_NO_FOREACH -MODULE_VERSION = 5.15.13 +MODULE_VERSION = 5.15.14 diff --git a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java index ebfe8da..366be27 100644 --- a/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java +++ b/src/jar/src/org/qtproject/qt5/android/view/QtAndroidWebViewController.java @@ -90,6 +90,7 @@ public class QtAndroidWebViewController private native void c_onReceivedTitle(long id, String title); private native void c_onRunJavaScriptResult(long id, long callbackId, String result); private native void c_onReceivedError(long id, int errorCode, String description, String url); + private native void c_processEventsFromQueue(); // We need to block the UI thread in some cases, if it takes to long we should timeout before // ANR kicks in... Usually the hard limit is set to 10s and if exceed that then we're in trouble. @@ -257,10 +258,19 @@ public class QtAndroidWebViewController } }); - try { - sem.acquire(); - } catch (Exception e) { - e.printStackTrace(); + boolean semAcquired = false; + while (!semAcquired) { + try { + semAcquired = sem.tryAcquire(BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS); + } catch (Exception e) { + e.printStackTrace(); + } + if (!semAcquired) { + // If the waiting time elapsed before a permit was acquired probably we have a + // deadlock here. To unlock the thread that block us, we need to process events + // from the queue and try again. + c_processEventsFromQueue(); + } } } diff --git a/src/plugins/android/qandroidwebview.cpp b/src/plugins/android/qandroidwebview.cpp index 91122bd..29e3cf2 100644 --- a/src/plugins/android/qandroidwebview.cpp +++ b/src/plugins/android/qandroidwebview.cpp @@ -48,6 +48,9 @@ #include <QtCore/qurl.h> #include <QtCore/qdebug.h> +#include <QAbstractEventDispatcher> +#include <QThread> + QT_BEGIN_NAMESPACE static const char qtAndroidWebViewControllerClass[] = "org/qtproject/qt5/android/view/QtAndroidWebViewController"; @@ -407,6 +410,18 @@ static void c_onReceivedError(JNIEnv *env, Q_EMIT wc->loadingChanged(loadRequest); } +static void c_processEventsFromQueue(JNIEnv *env, jobject thiz) +{ + Q_UNUSED(env) + Q_UNUSED(thiz) + if (QThread::currentThread() == qGuiApp->thread()) { + auto eventDispatcher = QThread::currentThread()->eventDispatcher(); + if (eventDispatcher) + eventDispatcher->processEvents( + QEventLoop::ExcludeUserInputEvents|QEventLoop::ExcludeSocketNotifiers); + } +} + JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/) { static bool initialized = false; @@ -438,7 +453,8 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/) {"c_onReceivedIcon", "(JLandroid/graphics/Bitmap;)V", reinterpret_cast<void *>(c_onReceivedIcon)}, {"c_onReceivedTitle", "(JLjava/lang/String;)V", reinterpret_cast<void *>(c_onReceivedTitle)}, {"c_onRunJavaScriptResult", "(JJLjava/lang/String;)V", reinterpret_cast<void *>(c_onRunJavaScriptResult)}, - {"c_onReceivedError", "(JILjava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(c_onReceivedError)} + {"c_onReceivedError", "(JILjava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(c_onReceivedError)}, + {"c_processEventsFromQueue", "()V", reinterpret_cast<void *>(c_processEventsFromQueue)} }; const int nMethods = sizeof(methods) / sizeof(methods[0]); |