Paste P579

Masterwork From Distant Lands
ActivePublic

Authored by davidedmundson on Apr 9 2020, 10:28 AM.
commit ec73ef2e32be74f66a3676df0dcb23b32568bbe5
Author: David Edmundson <davidedmundson@kde.org>
Date: Thu Apr 9 11:25:11 2020 +0100
asdf
Change-Id: I91f35dab49f0216f343a2e74c54f1c5f1aca6631
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 9fa2f15f..4305cfd6 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -252,16 +252,19 @@ void QWaylandWindow::reset(bool sendDestroyEvent)
mSurface.reset();
}
- if (mFrameCallback) {
- wl_callback_destroy(mFrameCallback);
- mFrameCallback = nullptr;
+ {
+ QWriteLocker frameLock(&mFrameCallbackLock);
+ if (mFrameCallback) {
+ wl_callback_destroy(mFrameCallback);
+ mFrameCallback = nullptr;
+ }
+ mWaitingForFrameCallback = false;
}
int timerId = mFrameCallbackTimerId.fetchAndStoreOrdered(-1);
if (timerId != -1) {
killTimer(timerId);
}
- mWaitingForFrameCallback = false;
mFrameCallbackTimedOut = false;
mMask = QRegion();
@@ -604,8 +607,10 @@ void QWaylandWindow::handleFrameCallback()
{
// Stop the timer and stop waiting immediately
int timerId = mFrameCallbackTimerId.fetchAndStoreOrdered(-1);
- mWaitingForFrameCallback = false;
-
+ {
+ QWriteLocker frameLock(&mFrameCallbackLock);
+ mWaitingForFrameCallback = false;
+ }
// The rest can wait until we can run it on the correct thread
auto doHandleExpose = [this, timerId]() {
if (timerId != -1)
@@ -630,6 +635,7 @@ QMutex QWaylandWindow::mFrameSyncMutex;
bool QWaylandWindow::waitForFrameSync(int timeout)
{
+ QReadLocker frameLock(&mFrameCallbackLock);
if (!mWaitingForFrameCallback)
return true;
@@ -1152,15 +1158,18 @@ void QWaylandWindow::handleUpdate()
if (!mSurface)
return;
- if (mFrameCallback) {
- wl_callback_destroy(mFrameCallback);
- mFrameCallback = nullptr;
- }
+ {
+ QWriteLocker frameLock(&mFrameCallbackLock);
+ if (mFrameCallback) {
+ wl_callback_destroy(mFrameCallback);
+ mFrameCallback = nullptr;
+ }
- mFrameCallback = mSurface->frame();
- wl_callback_add_listener(mFrameCallback, &QWaylandWindow::callbackListener, this);
- mWaitingForFrameCallback = true;
- mWaitingForUpdate = false;
+ mFrameCallback = mSurface->frame();
+ wl_callback_add_listener(mFrameCallback, &QWaylandWindow::callbackListener, this);
+ mWaitingForFrameCallback = true;
+ mWaitingForUpdate = false;
+ }
// Stop current frame timer if any, can't use killTimer directly, see comment above.
int fcbId = mFrameCallbackTimerId.fetchAndStoreOrdered(-1);
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index 352df89d..304d31e9 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -223,6 +223,7 @@ protected:
Qt::MouseButtons mMousePressedInContentArea = Qt::NoButton;
WId mWindowId;
+ QReadWriteLock mFrameCallbackLock; // guards mWaitingForFrameCallback and mFrameCallback
bool mWaitingForFrameCallback = false;
bool mFrameCallbackTimedOut = false; // Whether the frame callback has timed out
QAtomicInt mFrameCallbackTimerId = -1; // Started on commit, reset on frame callback
davidedmundson edited the content of this paste. (Show Details)Apr 9 2020, 10:28 AM
davidedmundson changed the title of this paste from untitled to Masterwork From Distant Lands.