diff options
| author | Petri Virkkunen <petri.virkkunen@qt.io> | 2024-09-18 10:51:08 +0300 |
|---|---|---|
| committer | Petri Virkkunen <petri.virkkunen@qt.io> | 2024-10-02 09:12:48 +0300 |
| commit | 0f20feea2112c2391e274dc4e81aa38a738b7023 (patch) | |
| tree | 611143b97bedd20879daac488a943381ccfe7d3a /src/plugins/platforms/android/qandroidplatformwindow.cpp | |
| parent | 9343d1ab6e1a5df3166d211809f2eb0e5a3cd878 (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.cpp | 16 |
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(), |
