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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2225>
This commit is contained in:
Jonas Ådahl 2022-01-09 23:37:45 +01:00 committed by Marge Bot
parent 8e91c6295d
commit bb6ae40a0f

View File

@ -2146,10 +2146,7 @@ meta_onscreen_native_dispose (GObject *object)
switch (renderer_gpu_data->mode) switch (renderer_gpu_data->mode)
{ {
case META_RENDERER_NATIVE_MODE_GBM: case META_RENDERER_NATIVE_MODE_GBM:
/* flip state takes a reference on the onscreen so there should g_clear_object (&onscreen_native->gbm.next_fb);
* never be outstanding flips when we reach here. */
g_warn_if_fail (onscreen_native->gbm.next_fb == NULL);
free_current_bo (onscreen); free_current_bo (onscreen);
break; break;
case META_RENDERER_NATIVE_MODE_SURFACELESS: case META_RENDERER_NATIVE_MODE_SURFACELESS: