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
parent
9baf1d5256
commit
1a87f06916
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue