1
0
Fork 0

window: Freeze stack when calculating showing state

Constantly manipulating the stack caused severe stalls (several seconds)
with many open windows when switching workspaces. The cause for this was
that each show/hide call dealt with the stack in isolation, meaning if
you hid N windows, we'd manipulate and synchronize the stack N times,
potentially doing synchronous calls to the X server while doing so.

Avoid the most severe stalls by freezing the stack while calculating
showing; this made the worst case go from several seconds to around
10-20 ms, which is still bad, but by far not as bad.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1616>
This commit is contained in:
Jonas Ådahl 2020-11-30 11:03:16 +01:00 committed by Marge Bot
parent fc6446f326
commit d43c8cd842

View file

@ -1798,6 +1798,7 @@ stackcmp (gconstpointer a, gconstpointer b)
static gboolean
idle_calc_showing (gpointer data)
{
MetaDisplay *display = meta_get_display ();
GSList *tmp;
GSList *copy;
GSList *should_show;
@ -1868,6 +1869,8 @@ idle_calc_showing (gpointer data)
tmp = tmp->next;
}
meta_stack_freeze (display->stack);
tmp = should_show;
while (tmp != NULL)
{
@ -1892,6 +1895,8 @@ idle_calc_showing (gpointer data)
tmp = tmp->next;
}
meta_stack_thaw (display->stack);
tmp = copy;
while (tmp != NULL)
{