From d43c8cd8425fe1ab83c1c959a07f99c21f4844c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 30 Nov 2020 11:03:16 +0100 Subject: [PATCH] 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: --- src/core/window.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/core/window.c b/src/core/window.c index 2268d1fd7..2c9a7fbb5 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -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) {