Diffusion KWin e0f95fd913b6

Delay syncing internal window geometry to end of cycle

Authored by graesslin on Sep 6 2017, 6:45 PM.

Description

Delay syncing internal window geometry to end of cycle

Summary:
The syncing of the window geometry to the internal geometry can
unfortunately cause a freeze in very special conditions:

  1. create QML component
  2. a Plasma::Dialog gets created
  3. It creates the DialogShadows
  4. This triggers QGlobalStatic creation which locks a non-recursive

mutex

  1. The creation of DialogShadows creates a Registry and triggers a

roundtrip on the Wayland server

  1. KWin processes all Wayland events
  2. This triggers the creation of a ShellClient
  3. The ShellClient has a PlasmaShellSurface which requested a position
  4. The new geometry does not match the geometry of the Plasma::Dialog
  5. ShellClient syncs the geometry to the Plasma::Dialog
  6. Plasma::Dialog updates the theme because window geometry changed
  7. This accesses the DialogShadows...

which is still in the non recursive mutex and we have a freeze.

By delaying the sync to the end of cycle we jump out of this deadly
sequence.

BUG: 384441

Test Plan:
The freeze doesn't hit any more. It's possible that some test
cases need adjustments.

Reviewers: KWin, Plasma

Subscribers: plasma-devel, kwin

Tags: KWin

Differential Revision: https://phabricator.kde.org/D7712