From: Philip Langdale Date: Fri, 9 Feb 2007 02:07:19 +0000 (-0800) Subject: Fix a race condition when switching to a multihead fullscreen mode. X-Git-Tag: vmware-10_15_0~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2ec8c25cc935a318bd07c0d1fba9960dfe8f38d4;p=platform%2Fupstream%2Fxf86-video-vmware.git Fix a race condition when switching to a multihead fullscreen mode. 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. --- diff --git a/src/vmwarectrl.c b/src/vmwarectrl.c index f2c831d..dc9e91f 100644 --- a/src/vmwarectrl.c +++ b/src/vmwarectrl.c @@ -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);