summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/kernel/qjnihelpers.cpp12
-rw-r--r--src/corelib/kernel/qjnihelpers_p.h3
-rw-r--r--src/corelib/platform/android/qandroidextras.cpp3
3 files changed, 17 insertions, 1 deletions
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp
index b2a5dc7441..73b15ce46a 100644
--- a/src/corelib/kernel/qjnihelpers.cpp
+++ b/src/corelib/kernel/qjnihelpers.cpp
@@ -376,6 +376,18 @@ jobject QtAndroidPrivate::callOnBindListener(jobject intent)
return nullptr;
}
+Q_GLOBAL_STATIC(QAtomicInt, g_androidDeadlockProtector);
+
+bool QtAndroidPrivate::acquireAndroidDeadlockProtector()
+{
+ return g_androidDeadlockProtector->testAndSetAcquire(0, 1);
+}
+
+void QtAndroidPrivate::releaseAndroidDeadlockProtector()
+{
+ g_androidDeadlockProtector->storeRelease(0);
+}
+
QT_END_NAMESPACE
Q_CORE_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
diff --git a/src/corelib/kernel/qjnihelpers_p.h b/src/corelib/kernel/qjnihelpers_p.h
index 2860cef4c3..c89c33b51e 100644
--- a/src/corelib/kernel/qjnihelpers_p.h
+++ b/src/corelib/kernel/qjnihelpers_p.h
@@ -137,6 +137,9 @@ namespace QtAndroidPrivate
Q_CORE_EXPORT int acuqireServiceSetup(int flags);
Q_CORE_EXPORT void setOnBindListener(OnBindListener *listener);
Q_CORE_EXPORT jobject callOnBindListener(jobject intent);
+
+ Q_CORE_EXPORT bool acquireAndroidDeadlockProtector();
+ Q_CORE_EXPORT void releaseAndroidDeadlockProtector();
}
#define Q_JNI_FIND_AND_CHECK_CLASS(CLASS_NAME) \
diff --git a/src/corelib/platform/android/qandroidextras.cpp b/src/corelib/platform/android/qandroidextras.cpp
index d9bcc76a1a..155f88b921 100644
--- a/src/corelib/platform/android/qandroidextras.cpp
+++ b/src/corelib/platform/android/qandroidextras.cpp
@@ -1230,7 +1230,7 @@ QtAndroidPrivate::requestPermission(QtAndroidPrivate::PermissionType permission)
promise->start();
const auto nativePermissions = nativeStringsFromPermission(permission);
- if (nativePermissions.size() > 0) {
+ if (nativePermissions.size() > 0 && QtAndroidPrivate::acquireAndroidDeadlockProtector()) {
requestPermissionsInternal(nativePermissions).then(
[promise, permission](QFuture<QtAndroidPrivate::PermissionResult> future) {
auto AuthorizedCount = future.results().count(QtAndroidPrivate::Authorized);
@@ -1242,6 +1242,7 @@ QtAndroidPrivate::requestPermission(QtAndroidPrivate::PermissionType permission)
} else {
promise->addResult(QtAndroidPrivate::Denied, 0);
}
+ QtAndroidPrivate::releaseAndroidDeadlockProtector();
promise->finish();
});