diff options
author | Rami Potinkara <rami.potinkara@qt.io> | 2021-11-23 21:50:55 +0200 |
---|---|---|
committer | Rami Potinkara <rami.potinkara@qt.io> | 2021-11-26 02:27:49 +0200 |
commit | 1a87f069161c23e8febf5173b5f533d84d0eb4a8 (patch) | |
tree | f1b996b51795ffe3d4cbe32a771553cd3026aef4 | |
parent | 9baf1d525625a60ce9fa6b9c0e6788d0d4d93e6e (diff) |
Android: Set sem_wait m_terminateSemaphore behind an atomic flag
Prevents QML app using QtActivity never calling
AndroidJniMain::startQt..'s to jam as ANR
Pick-to: 6.2 5.15
Task-number: QTBUG-97115
Change-Id: Ibfe8579dbb701068f4896b6d826ff487094bdf56
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
-rw-r--r-- | src/plugins/platforms/android/androidjnimain.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 6dff19f3d5..ac13c1c396 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -60,6 +60,7 @@ #include <android/bitmap.h> #include <QtCore/private/qjnihelpers_p.h> +#include <QtCore/qbasicatomic.h> #include <QtCore/qjnienvironment.h> #include <QtCore/qjniobject.h> #include <QtCore/qresource.h> @@ -123,6 +124,8 @@ static const char m_qtTag[] = "Qt"; static const char m_classErrorMsg[] = "Can't find class \"%s\""; static const char m_methodErrorMsg[] = "Can't find method \"%s%s\""; +static QBasicAtomicInt startQtAndroidPluginCalled = Q_BASIC_ATOMIC_INITIALIZER(0); + namespace QtAndroid { QBasicMutex *platformInterfaceMutex() @@ -545,6 +548,7 @@ static void startQtApplication(JNIEnv */*env*/, jclass /*clazz*/) for (int i = 0; i < m_applicationParams.size(); i++) params[i] = static_cast<const char *>(m_applicationParams[i].constData()); + startQtAndroidPluginCalled.fetchAndAddRelease(1); int ret = m_main(m_applicationParams.length(), const_cast<char **>(params.data())); if (m_mainLibraryHnd) { @@ -592,7 +596,9 @@ static void terminateQt(JNIEnv *env, jclass /*clazz*/) QAndroidEventDispatcherStopper::instance()->goingToStop(false); } - sem_wait(&m_terminateSemaphore); + if (startQtAndroidPluginCalled.loadAcquire()) + sem_wait(&m_terminateSemaphore); + sem_destroy(&m_terminateSemaphore); env->DeleteGlobalRef(m_applicationClass); |