From 593c22ea2c2231d46596ca24e336b2fce1a9db55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Sun, 9 Jan 2022 23:37:45 +0100 Subject: [PATCH] onscreen/native: Always free the next framebuffer on dispose There was a sanity check that complained if there was still a "next framebuffer" when disposing an onscreen. This is correct to complain about under normal operation, as we always wait until receiving the page flip callback before cleaning up the onscreen and their state. However, when there are many hotplugs occurring, we might end up with race conditions when the above sanity check is not valid: when we have more than one monitor active, paint 1 one of them, but receive a hotplug event before we paint the other(s), we will discard the already painted onscreen before really issuing a page flip. In this situation, we will have the "next framebuffer", but having that is not a bug, it's a race condition, thus to not leak in this situation, make sure to clean up the next framebuffer here too. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2081 Part-of: (cherry picked from commit bb6ae40a0feb93727dff8c51bf0560279d8d89db) --- src/backends/native/meta-onscreen-native.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c index e67a72aaa1b..05c3b6b9f18 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -2122,10 +2122,7 @@ meta_onscreen_native_dispose (GObject *object) switch (renderer_gpu_data->mode) { case META_RENDERER_NATIVE_MODE_GBM: - /* flip state takes a reference on the onscreen so there should - * never be outstanding flips when we reach here. */ - g_warn_if_fail (onscreen_native->gbm.next_fb == NULL); - + g_clear_object (&onscreen_native->gbm.next_fb); free_current_bo (onscreen); break; case META_RENDERER_NATIVE_MODE_SURFACELESS: -- GitLab