diff options
author | Paul Olav Tvete <paul.tvete@qt.io> | 2022-03-15 16:53:04 +0100 |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@qt.io> | 2022-03-21 14:40:34 +0000 |
commit | 51ad57f31f33b3c57f0a72746b6cad9dd5d87565 (patch) | |
tree | 64cfa425bca70029339519a5463143ab7dac6d18 /src/client/qwaylandwindow.cpp | |
parent | 08ce6129981576c93e0b3b9cc2a8b940646753fc (diff) | |
download | qtwayland-51ad57f31f33b3c57f0a72746b6cad9dd5d87565.tar.gz |
Fix race condition on mWaitingForUpdateDelivery
Change-Id: I0e91bda73722468b9339fc434fe04420b5e7d3da
Reviewed-by: David Edmundson <davidedmundson@kde.org>
Diffstat (limited to 'src/client/qwaylandwindow.cpp')
-rw-r--r-- | src/client/qwaylandwindow.cpp | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp index 05e7160b..23e73660 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) |