From 2ec8c25cc935a318bd07c0d1fba9960dfe8f38d4 Mon Sep 17 00:00:00 2001 From: Philip Langdale Date: Thu, 8 Feb 2007 18:07:19 -0800 Subject: 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. --- src/vmwarectrl.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/vmwarectrl.c') 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); -- cgit v1.2.3