diff options
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/kernel/qjnihelpers.cpp | 12 | ||||
-rw-r--r-- | src/corelib/kernel/qjnihelpers_p.h | 3 | ||||
-rw-r--r-- | src/corelib/platform/android/qandroidextras.cpp | 3 |
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(); }); |