Skip to content

Fix stage update scheduling race condition

Jonas Ådahl requested to merge jadahl/mutter:wip/stage-update-mapped-race into main

From the main commit:

stage: Clear update_scheduled field when update discarded

clutter_stage_schedule_update() sets the field update_scheduled to TRUE as an optimization to make redundant updates a no-op. This failed if there was a pending event and if the stage was not yet mapped.

What happened is:

  • clutter_stage_schedule_update() is called
    • ClutterStage::update_scheduled is set to TRUE
    • frame clock scheduled
  • frame clock dispatches
    • frame is discarded early, no actual stage update happens
  • device is created (e.g. virtual device from remote desktop session) - device-added event reaches ClutterStage::event_queue
  • stage is shown
    • clutter_stage_schedule_update() is called
    • ClutterStage::update_scheduled is TRUE
    • ClutterStage::event_queue has events in it
    • These two conditions means clutter_schedule_update() becomes a no-op

At this point, no more updates will happen from clutter_stage_schedule_update().

Fix this by resetting ClutterStage::update_scheduled to FALSE even if the frame was discarded due to the stage not yet being mapped.

A test case is added that replicates the above descibed events.

Closes: #3804 (closed)

Merge request reports

Loading