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

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