summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@qt.io>2022-03-15 16:53:04 +0100
committerPaul Olav Tvete <paul.tvete@qt.io>2022-03-21 14:40:34 +0000
commit51ad57f31f33b3c57f0a72746b6cad9dd5d87565 (patch)
tree64cfa425bca70029339519a5463143ab7dac6d18
parent08ce6129981576c93e0b3b9cc2a8b940646753fc (diff)
Fix race condition on mWaitingForUpdateDelivery
Change-Id: I0e91bda73722468b9339fc434fe04420b5e7d3da Reviewed-by: David Edmundson <davidedmundson@kde.org>
-rw-r--r--src/client/qwaylandwindow.cpp6
-rw-r--r--src/client/qwaylandwindow_p.h2
2 files changed, 3 insertions, 5 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 05e7160be..23e736608 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -716,18 +716,17 @@ void QWaylandWindow::handleFrameCallback()
mFrameCallbackElapsedTimer.invalidate();
// The rest can wait until we can run it on the correct thread
- 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, &QWaylandWindow::doHandleFrameCallback, Qt::QueuedConnection);
}
-
mFrameSyncWait.notify_all();
}
void QWaylandWindow::doHandleFrameCallback()
{
+ mWaitingForUpdateDelivery.storeRelease(false);
bool wasExposed = isExposed();
mFrameCallbackTimedOut = false;
if (!wasExposed && isExposed()) // Did setting mFrameCallbackTimedOut make the window exposed?
@@ -735,7 +734,6 @@ void QWaylandWindow::doHandleFrameCallback()
if (wasExposed && hasPendingUpdateRequest())
deliverUpdateRequest();
- mWaitingForUpdateDelivery = false;
}
bool QWaylandWindow::waitForFrameSync(int timeout)
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index d8eebb738..8fcbc4dcc 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -283,7 +283,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;