Blame SOURCES/0020-Client-Always-destroy-frame-callback-in-the-actual-c.patch

f38a11
From fb0a5265ec9d83b56563769cc1b756aeca42ce65 Mon Sep 17 00:00:00 2001
b814f0
From: Georges Basile Stavracas Neto <gbsneto@gnome.org>
b814f0
Date: Thu, 27 May 2021 20:02:53 -0300
f38a11
Subject: [PATCH 20/40] Client: Always destroy frame callback in the actual
b814f0
 callback
b814f0
b814f0
It's good hygiene to destroy all frame callbacks. Destroy the
b814f0
frame callback and cleanup the mFrameCallback class member in
b814f0
the callback itself. The callback destruction happens before
b814f0
calling handleFrameCallback() to avoid the theoretical case
b814f0
where another frame callback is queued by handleFrameCallback(),
b814f0
and then immediately destroyed in the callback handler.
b814f0
b814f0
* asturmlechner 2021-09-27:
b814f0
  Conflict resolved from non-backported commit in dev branch:
b814f0
  93058de8d7e7c2f320c22b3bd898aa06cf5babcd
b814f0
b814f0
Change-Id: Ide6dc95e3402932c58bfc088a9d471fda821e9a1
b814f0
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
b814f0
(cherry picked from commit 42cdc61a93cf2acb09936aebb5e431fdbc0a26c6)
b814f0
---
b814f0
 src/client/qwaylandwindow.cpp | 11 +++++------
b814f0
 1 file changed, 5 insertions(+), 6 deletions(-)
b814f0
b814f0
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
b814f0
index 85307875..c020a58f 100644
b814f0
--- a/src/client/qwaylandwindow.cpp
b814f0
+++ b/src/client/qwaylandwindow.cpp
b814f0
@@ -622,9 +622,13 @@ void QWaylandWindow::commit()
b814f0
 
b814f0
 const wl_callback_listener QWaylandWindow::callbackListener = {
b814f0
     [](void *data, wl_callback *callback, uint32_t time) {
b814f0
-        Q_UNUSED(callback);
b814f0
         Q_UNUSED(time);
b814f0
         auto *window = static_cast<QWaylandWindow*>(data);
b814f0
+
b814f0
+        Q_ASSERT(callback == window->mFrameCallback);
b814f0
+        wl_callback_destroy(callback);
b814f0
+        window->mFrameCallback = nullptr;
b814f0
+
b814f0
         window->handleFrameCallback();
b814f0
     }
b814f0
 };
b814f0
@@ -1179,11 +1183,6 @@ void QWaylandWindow::handleUpdate()
b814f0
     if (!mSurface)
b814f0
         return;
b814f0
 
b814f0
-    if (mFrameCallback) {
b814f0
-        wl_callback_destroy(mFrameCallback);
b814f0
-        mFrameCallback = nullptr;
b814f0
-    }
b814f0
-
b814f0
     QMutexLocker locker(mFrameQueue.mutex);
b814f0
     struct ::wl_surface *wrappedSurface = reinterpret_cast<struct ::wl_surface *>(wl_proxy_create_wrapper(mSurface->object()));
b814f0
     wl_proxy_set_queue(reinterpret_cast<wl_proxy *>(wrappedSurface), mFrameQueue.queue);
b814f0
-- 
b814f0
2.35.1
b814f0