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

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