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

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