Android: Fix hang in runOnAndroidThreadSync and requestPermissionsSync
Keep spinning the main event loop if we can't acquire the semaphore, this way the Android UI thread can post events on it. Fixes: QTBUG-74076 Change-Id: Ia87e0535f94c67728176918ab928ff5ce8b00f8e Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
This commit is contained in:
parent
1269f9cd16
commit
9ca81260e9
@ -45,6 +45,7 @@
|
||||
#include "qsharedpointer.h"
|
||||
#include "qvector.h"
|
||||
#include "qthread.h"
|
||||
#include "qcoreapplication.h"
|
||||
#include <QtCore/qrunnable.h>
|
||||
|
||||
#include <deque>
|
||||
@ -474,6 +475,17 @@ void QtAndroidPrivate::runOnAndroidThread(const QtAndroidPrivate::Runnable &runn
|
||||
env->CallStaticVoidMethod(g_jNativeClass, g_runPendingCppRunnablesMethodID);
|
||||
}
|
||||
|
||||
static bool waitForSemaphore(int timeoutMs, QSharedPointer<QSemaphore> sem)
|
||||
{
|
||||
while (timeoutMs > 0) {
|
||||
if (sem->tryAcquire(1, 10))
|
||||
return true;
|
||||
timeoutMs -= 10;
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void QtAndroidPrivate::runOnAndroidThreadSync(const QtAndroidPrivate::Runnable &runnable, JNIEnv *env, int timeoutMs)
|
||||
{
|
||||
QSharedPointer<QSemaphore> sem(new QSemaphore);
|
||||
@ -481,7 +493,7 @@ void QtAndroidPrivate::runOnAndroidThreadSync(const QtAndroidPrivate::Runnable &
|
||||
runnable();
|
||||
sem->release();
|
||||
}, env);
|
||||
sem->tryAcquire(1, timeoutMs);
|
||||
waitForSemaphore(timeoutMs, sem);
|
||||
}
|
||||
|
||||
void QtAndroidPrivate::requestPermissions(JNIEnv *env, const QStringList &permissions, const QtAndroidPrivate::PermissionsResultFunc &callbackFunc, bool directCall)
|
||||
@ -524,7 +536,7 @@ QtAndroidPrivate::PermissionsHash QtAndroidPrivate::requestPermissionsSync(JNIEn
|
||||
*res = result;
|
||||
sem->release();
|
||||
}, true);
|
||||
if (sem->tryAcquire(1, timeoutMs))
|
||||
if (waitForSemaphore(timeoutMs, sem))
|
||||
return std::move(*res);
|
||||
else // mustn't touch *res
|
||||
return QHash<QString, QtAndroidPrivate::PermissionsResult>();
|
||||
|
Loading…
x
Reference in New Issue
Block a user