qt5-qtwayland/0036-Fix-race-condition-on-mWaitingForUpdateDelivery.patch

60 lines
2.3 KiB
Diff
Raw Normal View History

2022-07-14 07:02:36 +00:00
From 72c608846ccb39a542d598d7b87ab709f38b969d Mon Sep 17 00:00:00 2001
2022-04-16 05:30:41 +00:00
From: Paul Olav Tvete <paul.tvete@qt.io>
Date: Tue, 15 Mar 2022 16:53:04 +0100
2022-07-14 07:02:36 +00:00
Subject: [PATCH 36/39] Fix race condition on mWaitingForUpdateDelivery
2022-04-16 05:30:41 +00:00
Change-Id: I0e91bda73722468b9339fc434fe04420b5e7d3da
Reviewed-by: David Edmundson <davidedmundson@kde.org>
---
src/client/qwaylandwindow.cpp | 7 ++-----
src/client/qwaylandwindow_p.h | 2 +-
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index bf41cc5b..ceaa4c73 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -649,24 +649,21 @@ void QWaylandWindow::handleFrameCallback()
// The rest can wait until we can run it on the correct thread
auto doHandleExpose = [this]() {
+ mWaitingForUpdateDelivery.storeRelease(false);
bool wasExposed = isExposed();
mFrameCallbackTimedOut = false;
if (!wasExposed && isExposed()) // Did setting mFrameCallbackTimedOut make the window exposed?
sendExposeEvent(QRect(QPoint(), geometry().size()));
if (wasExposed && hasPendingUpdateRequest())
deliverUpdateRequest();
-
- mWaitingForUpdateDelivery = false;
};
- if (!mWaitingForUpdateDelivery) {
+ if (mWaitingForUpdateDelivery.testAndSetAcquire(false, true)) {
// Queued connection, to make sure we don't call handleUpdate() from inside waitForFrameSync()
// in the single-threaded case.
- mWaitingForUpdateDelivery = true;
QMetaObject::invokeMethod(this, doHandleExpose, Qt::QueuedConnection);
}
-
mFrameSyncWait.notify_all();
}
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index d45980a8..cb9135f6 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -228,7 +228,7 @@ protected:
WId mWindowId;
bool mWaitingForFrameCallback = false;
bool mFrameCallbackTimedOut = false; // Whether the frame callback has timed out
- bool mWaitingForUpdateDelivery = false;
+ QAtomicInt mWaitingForUpdateDelivery = false;
int mFrameCallbackCheckIntervalTimerId = -1;
QElapsedTimer mFrameCallbackElapsedTimer;
struct ::wl_callback *mFrameCallback = nullptr;
--
2022-05-17 08:02:19 +00:00
2.36.1
2022-04-16 05:30:41 +00:00