Avoid crash with on scripted window teardown with threaded quick render loop
ClosedPublic

Authored by davidedmundson on Aug 23 2018, 4:55 PM.

Details

Summary

Qt render loops behave quite differently to each other.

KWin scripting as a workaround for another situation cleans
(17553e5a1fb72a92dbbff3fa6bc7d55b8f1a0123) handles tracking of script
windows by deleting the underlying window handle on hide.

This currently happens before the window gets the hideEvent.

Arguably this is a quirk with Qt, but in the current state:

  • QSGThreadedRenderLoop deletes the platform window and cleans up
  • We then get the hide() event. This no-ops because there's no window. (else branch of case WM_TryRelease in qsgthreadedrenderloop.cpp)
  • We carry on rendering animations despite having no platform
  • undefined behaviour

Normally this isn't a problem as typically destruction of the platform window
happens only when a window is being deleted, we're messing with Qt
internals here.

If we make sure the QHideEvent is processed by the render loop first,
things seem fine.

BUG: 397767

Test Plan

Ran QSG_RENDER_LOOP=threaded
Read output with scenegraph logging rules on

Diff Detail

Repository
R108 KWin
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.
davidedmundson created this revision.Aug 23 2018, 4:55 PM
Restricted Application added a project: KWin. · View Herald TranscriptAug 23 2018, 4:55 PM
Restricted Application added a subscriber: kwin. · View Herald Transcript
davidedmundson requested review of this revision.Aug 23 2018, 4:55 PM
broulik accepted this revision.Aug 31 2018, 10:10 AM
This revision is now accepted and ready to land.Aug 31 2018, 10:10 AM
This revision was automatically updated to reflect the committed changes.