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>
bb10
Rami Potinkara 2021-11-23 21:50:55 +02:00
parent 9baf1d5256
commit 1a87f06916
1 changed files with 7 additions and 1 deletions

View File

@ -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);