diff options
8 files changed, 36 insertions, 8 deletions
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp index 14b139635e7..031149721a2 100644 --- a/src/corelib/kernel/qjnihelpers.cpp +++ b/src/corelib/kernel/qjnihelpers.cpp @@ -454,13 +454,25 @@ void QtAndroidPrivate::releaseAndroidDeadlockProtector() g_androidDeadlockProtector.storeRelease(0); } +QtAndroidPrivate::AndroidDeadlockProtector::AndroidDeadlockProtector(const QString &lockedBy) + : m_lockedBy(lockedBy) +{ } + QtAndroidPrivate::AndroidDeadlockProtector::~AndroidDeadlockProtector() { - if (m_acquired) + if (m_acquired) { QtAndroidPrivate::releaseAndroidDeadlockProtector(); + s_lockers.removeOne(m_lockedBy); + } } bool QtAndroidPrivate::AndroidDeadlockProtector::acquire() { m_acquired = QtAndroidPrivate::acquireAndroidDeadlockProtector(); + if (m_acquired) { + s_lockers.append(m_lockedBy); + } else { + qWarning("Failed to acquire deadlock protector for '%s' while already locked by '%s'.", + qPrintable(m_lockedBy), qPrintable(s_lockers.join(u','))); + } return m_acquired; } diff --git a/src/corelib/kernel/qjnihelpers_p.h b/src/corelib/kernel/qjnihelpers_p.h index 2741a5e87ed..3a6e2e62abe 100644 --- a/src/corelib/kernel/qjnihelpers_p.h +++ b/src/corelib/kernel/qjnihelpers_p.h @@ -72,11 +72,15 @@ namespace QtAndroidPrivate class Q_CORE_EXPORT AndroidDeadlockProtector { public: + AndroidDeadlockProtector(const QString &lockedBy); ~AndroidDeadlockProtector(); bool acquire(); private: bool m_acquired = false; + QString m_lockedBy; + + inline static QStringList s_lockers; }; Q_CORE_EXPORT QtJniTypes::Activity activity(); diff --git a/src/corelib/platform/android/qandroidextras.cpp b/src/corelib/platform/android/qandroidextras.cpp index b605224d53c..34d5a326fb6 100644 --- a/src/corelib/platform/android/qandroidextras.cpp +++ b/src/corelib/platform/android/qandroidextras.cpp @@ -17,6 +17,7 @@ QT_BEGIN_NAMESPACE +using namespace Qt::StringLiterals; using namespace QtJniTypes; class QAndroidParcelPrivate @@ -1099,7 +1100,8 @@ requestPermissionsInternal(const QStringList &permissions) return QtFuture::makeReadyRangeFuture(result); } - QtAndroidPrivate::AndroidDeadlockProtector protector; + QtAndroidPrivate::AndroidDeadlockProtector protector( + u"requestPermissionsInternal()"_s); if (!protector.acquire()) return QtFuture::makeReadyValueFuture(QtAndroidPrivate::Denied); diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp index 6473fd7eed8..add32f19e4f 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.cpp +++ b/src/plugins/platforms/android/androidjniaccessibility.cpp @@ -63,7 +63,8 @@ namespace QtAndroidAccessibility template <typename Func, typename Ret> void runInObjectContext(QObject *context, Func &&func, Ret *retVal) { - QtAndroidPrivate::AndroidDeadlockProtector protector; + QtAndroidPrivate::AndroidDeadlockProtector protector( + u"QtAndroidAccessibility::runInObjectContext()"_s); if (!protector.acquire()) { __android_log_print(ANDROID_LOG_WARN, m_qtTag, "Could not run accessibility call in object context, accessing " diff --git a/src/plugins/platforms/android/qandroideventdispatcher.cpp b/src/plugins/platforms/android/qandroideventdispatcher.cpp index b620ce95d7f..4e088ab0d32 100644 --- a/src/plugins/platforms/android/qandroideventdispatcher.cpp +++ b/src/plugins/platforms/android/qandroideventdispatcher.cpp @@ -4,6 +4,8 @@ #include "qandroideventdispatcher.h" #include "androidjnimain.h" +using namespace Qt::StringLiterals; + QAndroidEventDispatcher::QAndroidEventDispatcher(QObject *parent) : QUnixEventDispatcherQPA(parent) { @@ -52,7 +54,8 @@ bool QAndroidEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags flags |= QEventLoop::ExcludeSocketNotifiers | QEventLoop::X11ExcludeTimers; { - QtAndroidPrivate::AndroidDeadlockProtector protector; + QtAndroidPrivate::AndroidDeadlockProtector protector( + u"QAndroidEventDispatcher::processEvents()"_s); if (m_stopRequest.testAndSetAcquire(StopRequest, Stopping) && protector.acquire()) { m_semaphore.acquire(); wakeUp(); diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index ff0fe664514..ecbbddb2e36 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -26,6 +26,8 @@ QT_BEGIN_NAMESPACE +using namespace Qt::StringLiterals; + namespace { class BatchEditLock @@ -68,7 +70,8 @@ static jfieldID m_textFieldID = 0; static void runOnQtThread(const std::function<void()> &func) { - QtAndroidPrivate::AndroidDeadlockProtector protector; + QtAndroidPrivate::AndroidDeadlockProtector protector( + u"QAndroidInputContext::runOnQtThread()"_s); if (!protector.acquire()) return; QMetaObject::invokeMethod(m_androidInputContext, "safeCall", Qt::BlockingQueuedConnection, Q_ARG(std::function<void()>, func)); diff --git a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp index 95a4963756d..75a1c981e6c 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformopenglwindow.cpp @@ -60,9 +60,9 @@ EGLSurface QAndroidPlatformOpenGLWindow::eglSurface(EGLConfig config) // If we haven't called createSurface() yet, call it and wait until Android has created // the Surface if (!m_surfaceCreated) { - QtAndroidPrivate::AndroidDeadlockProtector protector; + static constexpr char funcName[] = "QAndroidPlatformOpenGLWindow::eglSurface()"; + QtAndroidPrivate::AndroidDeadlockProtector protector(funcName); if (!protector.acquire()) { - static constexpr char funcName[] = "QAndroidPlatformOpenGLWindow::eglSurface()"; qFatal("Failed to acquire deadlock protector for %s.", funcName); return m_eglSurface; } diff --git a/src/plugins/platforms/android/qandroidplatformvulkanwindow.cpp b/src/plugins/platforms/android/qandroidplatformvulkanwindow.cpp index b45d473c7e3..96bdc2f63f5 100644 --- a/src/plugins/platforms/android/qandroidplatformvulkanwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformvulkanwindow.cpp @@ -15,6 +15,8 @@ QT_BEGIN_NAMESPACE +using namespace Qt::StringLiterals; + QAndroidPlatformVulkanWindow::QAndroidPlatformVulkanWindow(QWindow *window) : QAndroidPlatformWindow(window), m_nativeWindow(nullptr), @@ -88,7 +90,8 @@ VkSurfaceKHR *QAndroidPlatformVulkanWindow::vkSurface() QMutexLocker lock(&m_surfaceMutex); if (!m_surfaceCreated) { - QtAndroidPrivate::AndroidDeadlockProtector protector; + QtAndroidPrivate::AndroidDeadlockProtector protector( + u"QAndroidPlatformVulkanWindow::vkSurface()"_s); if (!protector.acquire()) return &m_vkSurface; createSurface(); |
