Fix a race condition when switching to a multihead fullscreen mode.
authorPhilip Langdale <philipl@fido2.homeip.net>
Fri, 9 Feb 2007 02:07:19 +0000 (18:07 -0800)
committerPhilip Langdale <philipl@fido2.homeip.net>
Fri, 9 Feb 2007 02:07:19 +0000 (18:07 -0800)
Due to implemtation details on the host side, switching to a multihead
fullscreen mode means multiple mode changes along the way. However,
because rrSetScreenConfig returns before the mode change completes,
we can enter a race, where a subsequent SetDisplayTopology overrides
the current pending one, leading to a mode switch where the resolution
and topology are no longer consistent.

So, we fix this by ignoring any attempts to set the pending topology if
one is already pending.

src/vmwarectrl.c

index f2c831d..dc9e91f 100644 (file)
@@ -229,7 +229,8 @@ VMwareCtrlSetRes(ClientPtr client)
  * VMwareCtrlDoSetTopology --
  *
  *      Set the custom topology and set a dynamic mode to the bounding box
- *      of the passed topology.
+ *      of the passed topology. If a topology is already pending, then do
+ *      nothing but do not return failure.
  *
  * Results:
  *      TRUE on success, FALSE otherwise.
@@ -254,6 +255,11 @@ VMwareCtrlDoSetTopology(ScrnInfoPtr pScrn,
       short maxY = 0;
       size_t i;
 
+      if (pVMWARE->xineramaNextState) {
+         VmwareLog(("DoSetTopology: Aborting due to existing pending state\n"));
+         return TRUE;
+      }
+
       for (i = 0; i < number; i++) {
          maxX = MAX(maxX, extents[i].x_org + extents[i].width);
          maxY = MAX(maxY, extents[i].y_org + extents[i].height);