- Add patches to fix applications not updating after some time (kde#449163): * 0001-Client-Remove-mWaitingForUpdateDelivery.patch * 0002-Guard-mResizeDirty-by-the-correctMutex.patch * 0003-Fix-up-mutexes-for-frame-callbacks.patch - Add patch to fix several feature detection tests: * 0001-Use-proper-dependencies-in-compile-tests.patch OBS-URL: https://build.opensuse.org/request/show/951555 OBS-URL: https://build.opensuse.org/package/show/KDE:Qt:5.15/libqt5-qtwayland?expand=0&rev=20
88 lines
3.1 KiB
Diff
88 lines
3.1 KiB
Diff
From ee0ab1c58f1020e901b665c79684266730f1ce29 Mon Sep 17 00:00:00 2001
|
|
From: David Edmundson <davidedmundson@kde.org>
|
|
Date: Thu, 3 Feb 2022 14:27:08 +0000
|
|
Subject: [PATCH 3/3] Fix up mutexes for frame callbacks
|
|
|
|
Everything related to frame callback timings is used by potentially 3
|
|
threads. Access needs guarding.
|
|
|
|
Change-Id: I9f22390c175d9f2f63d31b1ebf0cdc0b830be937
|
|
---
|
|
src/client/qwaylandwindow.cpp | 14 +++++++++-----
|
|
src/client/qwaylandwindow_p.h | 10 +++++++---
|
|
2 files changed, 16 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
|
|
index 61700b32..84dcacc3 100644
|
|
--- a/src/client/qwaylandwindow.cpp
|
|
+++ b/src/client/qwaylandwindow.cpp
|
|
@@ -256,8 +256,12 @@ void QWaylandWindow::reset()
|
|
mFrameCallback = nullptr;
|
|
}
|
|
|
|
- mFrameCallbackElapsedTimer.invalidate();
|
|
- mWaitingForFrameCallback = false;
|
|
+ {
|
|
+ QMutexLocker locker(&mFrameSyncMutex);
|
|
+ mFrameCallbackElapsedTimer.invalidate();
|
|
+ mWaitingForFrameCallback = false;
|
|
+ }
|
|
+
|
|
mFrameCallbackTimedOut = false;
|
|
|
|
mMask = QRegion();
|
|
@@ -1132,6 +1136,7 @@ QVariant QWaylandWindow::property(const QString &name, const QVariant &defaultVa
|
|
|
|
void QWaylandWindow::timerEvent(QTimerEvent *event)
|
|
{
|
|
+ QMutexLocker locker(&mFrameSyncMutex);
|
|
if (event->timerId() != mFrameCallbackCheckIntervalTimerId)
|
|
return;
|
|
|
|
@@ -1190,15 +1195,14 @@ void QWaylandWindow::handleUpdate()
|
|
{
|
|
qCDebug(lcWaylandBackingstore) << "handleUpdate" << QThread::currentThread();
|
|
|
|
- if (mWaitingForFrameCallback)
|
|
- return;
|
|
-
|
|
// TODO: Should sync subsurfaces avoid requesting frame callbacks?
|
|
QReadLocker lock(&mSurfaceLock);
|
|
if (!mSurface)
|
|
return;
|
|
|
|
QMutexLocker locker(&mFrameSyncMutex);
|
|
+ if (mWaitingForFrameCallback)
|
|
+ return;
|
|
|
|
struct ::wl_surface *wrappedSurface = reinterpret_cast<struct ::wl_surface *>(wl_proxy_create_wrapper(mSurface->object()));
|
|
wl_proxy_set_queue(reinterpret_cast<wl_proxy *>(wrappedSurface), mDisplay->frameEventQueue());
|
|
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
|
|
index 3ff68ccb..025d7917 100644
|
|
--- a/src/client/qwaylandwindow_p.h
|
|
+++ b/src/client/qwaylandwindow_p.h
|
|
@@ -226,13 +226,17 @@ protected:
|
|
Qt::MouseButtons mMousePressedInContentArea = Qt::NoButton;
|
|
|
|
WId mWindowId;
|
|
+
|
|
+ // The following are used by the main thread the render thread and the event frame thread
|
|
+ // Access should be guarded by mFrameSyncMutex
|
|
+ QMutex mFrameSyncMutex;
|
|
+ QWaitCondition mFrameSyncWait;
|
|
bool mWaitingForFrameCallback = false;
|
|
- bool mFrameCallbackTimedOut = false; // Whether the frame callback has timed out
|
|
int mFrameCallbackCheckIntervalTimerId = -1;
|
|
QElapsedTimer mFrameCallbackElapsedTimer;
|
|
+
|
|
+ bool mFrameCallbackTimedOut = false; // Whether the frame callback has timed out
|
|
struct ::wl_callback *mFrameCallback = nullptr;
|
|
- QMutex mFrameSyncMutex;
|
|
- QWaitCondition mFrameSyncWait;
|
|
|
|
// True when we have called deliverRequestUpdate, but the client has not yet attached a new buffer
|
|
bool mWaitingForUpdate = false;
|
|
--
|
|
2.34.0
|
|
|