summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qjnihelpers.cpp14
-rw-r--r--src/corelib/kernel/qjnihelpers_p.h4
-rw-r--r--src/corelib/platform/android/qandroidextras.cpp4
-rw-r--r--src/plugins/platforms/android/androidjniaccessibility.cpp3
-rw-r--r--src/plugins/platforms/android/qandroideventdispatcher.cpp5
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp5
-rw-r--r--src/plugins/platforms/android/qandroidplatformopenglwindow.cpp4
-rw-r--r--src/plugins/platforms/android/qandroidplatformvulkanwindow.cpp5
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();