summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/android/qandroidplatformwindow.cpp
diff options
context:
space:
mode:
authorPetri Virkkunen <petri.virkkunen@qt.io>2024-09-18 10:51:08 +0300
committerPetri Virkkunen <petri.virkkunen@qt.io>2024-10-02 09:12:48 +0300
commit0f20feea2112c2391e274dc4e81aa38a738b7023 (patch)
tree611143b97bedd20879daac488a943381ccfe7d3a /src/plugins/platforms/android/qandroidplatformwindow.cpp
parent9343d1ab6e1a5df3166d211809f2eb0e5a3cd878 (diff)
Android: Add destruction guard in QAndroidPlatformWindow
To avoid calling functions in QAndroidPlatformWindow during/after destruction of the object, create a mutex and use lock_guard to synchronize the destruction of the object and native function calls originating from Android events. Task-number: QTBUG-118231 Pick-to: 6.8 Change-Id: I29818386456c6969ca507d74574b722bf8a19019 Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/plugins/platforms/android/qandroidplatformwindow.cpp')
-rw-r--r--src/plugins/platforms/android/qandroidplatformwindow.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/plugins/platforms/android/qandroidplatformwindow.cpp b/src/plugins/platforms/android/qandroidplatformwindow.cpp
index 4c76bfb3d48..1362b7d3929 100644
--- a/src/plugins/platforms/android/qandroidplatformwindow.cpp
+++ b/src/plugins/platforms/android/qandroidplatformwindow.cpp
@@ -96,6 +96,7 @@ void QAndroidPlatformWindow::initialize()
QAndroidPlatformWindow::~QAndroidPlatformWindow()
{
+ const auto guard = destructionGuard();
if (window()->isTopLevel())
platformScreen()->removeWindow(this);
}
@@ -353,6 +354,9 @@ void QAndroidPlatformWindow::setSurface(JNIEnv *env, jobject object, jint window
continue;
QAndroidPlatformWindow *platformWindow =
static_cast<QAndroidPlatformWindow *>(window->handle());
+ const auto guard = platformWindow->destructionGuard();
+ if (!platformWindow->m_surfaceCreated)
+ continue;
if (platformWindow->nativeViewId() == windowId)
platformWindow->onSurfaceChanged(surface);
}
@@ -373,6 +377,18 @@ void QAndroidPlatformWindow::windowFocusChanged(JNIEnv *env, jobject object,
}
}
+/*
+ Due to calls originating from Android, it is possible for native methods to
+ try to manipulate any given instance of QAndroidPlatformWindow when it is
+ already being destroyed. So we use this to guard against that. It is called
+ in the destructor, and should also be called in any function registered to
+ be called from java that may touch an instance of QAndroidPlatformWindow.
+ */
+QMutexLocker<QMutex> QAndroidPlatformWindow::destructionGuard()
+{
+ return QMutexLocker(&m_destructionMutex);
+}
+
bool QAndroidPlatformWindow::registerNatives(QJniEnvironment &env)
{
if (!env.registerNativeMethods(QtJniTypes::Traits<QtJniTypes::QtWindow>::className(),