[PATCH 1/8] dix: Remove cleverness from MoveWindowInStack

Adam Jackson ajax at redhat.com
Tue Aug 20 12:33:32 PDT 2013


This looks like it removes an optimisation, but this turns out not to be
the case!  For 1024x768x32 Xvfb on a 1.7GHz Ivybridge:

      before      after
    --------  --------- --------   --------------------------
    204437.1  1001917.1 (  4.90)   Circulate window (4 kids)
    130656.5   971734.9 (  7.44)   Circulate window (16 kids)
    127631.0   934420.7 (  7.32)   Circulate window (25 kids)
    122622.6   843778.1 (  6.88)   Circulate window (50 kids)
    116319.1   778275.1 (  6.69)   Circulate window (75 kids)
    109929.4   723284.9 (  6.58)   Circulate window (100 kids)
     83153.3   504731.3 (  6.07)   Circulate window (200 kids)

So let's just tear that out, and in doing so, remove a #ifdef ROOTLESS
from dix code.

Signed-off-by: Adam Jackson <ajax at redhat.com>
---
 dix/window.c     | 82 ++++----------------------------------------------------
 include/window.h |  4 +--
 mi/mioverlay.c   |  8 +++---
 mi/miwindow.c    |  8 +++---
 4 files changed, 15 insertions(+), 87 deletions(-)

diff --git a/dix/window.c b/dix/window.c
index 8950f97..4e3da64 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -1513,85 +1513,17 @@ GetWindowAttributes(WindowPtr pWin, ClientPtr client,
     wa->visualID = wVisual(pWin);
 }
 
-WindowPtr
+void
 MoveWindowInStack(WindowPtr pWin, WindowPtr pNextSib)
 {
-    WindowPtr pParent = pWin->parent;
-    WindowPtr pFirstChange = pWin;      /* highest window where list changes */
-
-    if (pWin->nextSib != pNextSib) {
-        WindowPtr pOldNextSib = pWin->nextSib;
-
-        if (!pNextSib) {        /* move to bottom */
-            if (pParent->firstChild == pWin)
-                pParent->firstChild = pWin->nextSib;
-            /* if (pWin->nextSib) *//* is always True: pNextSib == NULL
-             * and pWin->nextSib != pNextSib
-             * therefore pWin->nextSib != NULL */
-            pFirstChange = pWin->nextSib;
-            pWin->nextSib->prevSib = pWin->prevSib;
-            if (pWin->prevSib)
-                pWin->prevSib->nextSib = pWin->nextSib;
-            pParent->lastChild->nextSib = pWin;
-            pWin->prevSib = pParent->lastChild;
-            pWin->nextSib = NullWindow;
-            pParent->lastChild = pWin;
-        }
-        else if (pParent->firstChild == pNextSib) {     /* move to top */
-            pFirstChange = pWin;
-            if (pParent->lastChild == pWin)
-                pParent->lastChild = pWin->prevSib;
-            if (pWin->nextSib)
-                pWin->nextSib->prevSib = pWin->prevSib;
-            if (pWin->prevSib)
-                pWin->prevSib->nextSib = pWin->nextSib;
-            pWin->nextSib = pParent->firstChild;
-            pWin->prevSib = (WindowPtr) NULL;
-            pNextSib->prevSib = pWin;
-            pParent->firstChild = pWin;
-        }
-        else {                  /* move in middle of list */
-
-            WindowPtr pOldNext = pWin->nextSib;
-
-            pFirstChange = NullWindow;
-            if (pParent->firstChild == pWin)
-                pFirstChange = pParent->firstChild = pWin->nextSib;
-            if (pParent->lastChild == pWin) {
-                pFirstChange = pWin;
-                pParent->lastChild = pWin->prevSib;
-            }
-            if (pWin->nextSib)
-                pWin->nextSib->prevSib = pWin->prevSib;
-            if (pWin->prevSib)
-                pWin->prevSib->nextSib = pWin->nextSib;
-            pWin->nextSib = pNextSib;
-            pWin->prevSib = pNextSib->prevSib;
-            if (pNextSib->prevSib)
-                pNextSib->prevSib->nextSib = pWin;
-            pNextSib->prevSib = pWin;
-            if (!pFirstChange) {        /* do we know it yet? */
-                pFirstChange = pParent->firstChild;     /* no, search from top */
-                while ((pFirstChange != pWin) && (pFirstChange != pOldNext))
-                    pFirstChange = pFirstChange->nextSib;
-            }
-        }
-        if (pWin->drawable.pScreen->RestackWindow)
-            (*pWin->drawable.pScreen->RestackWindow) (pWin, pOldNextSib);
-    }
-
-#ifdef ROOTLESS
     /*
      * In rootless mode we can't optimize away window restacks.
      * There may be non-X windows around, so even if the window
      * is in the correct position from X's point of view,
      * the underlying window system may want to reorder it.
      */
-    else if (pWin->drawable.pScreen->RestackWindow)
+    if (pWin->drawable.pScreen->RestackWindow)
         (*pWin->drawable.pScreen->RestackWindow) (pWin, pWin->nextSib);
-#endif
-
-    return pFirstChange;
 }
 
 void
@@ -2039,7 +1971,7 @@ ReflectStackChange(WindowPtr pWin, WindowPtr pSib, VTKind kind)
 
     Bool WasViewable = (Bool) pWin->viewable;
     Bool anyMarked;
-    WindowPtr pFirstChange;
+    WindowPtr pFirstChange = pWin;
     WindowPtr pLayerWin;
     ScreenPtr pScreen = pWin->drawable.pScreen;
 
@@ -2047,7 +1979,7 @@ ReflectStackChange(WindowPtr pWin, WindowPtr pSib, VTKind kind)
     if (!pWin->parent)
         return;
 
-    pFirstChange = MoveWindowInStack(pWin, pSib);
+    MoveWindowInStack(pWin, pSib);
 
     if (WasViewable) {
         anyMarked = (*pScreen->MarkOverlappedWindows) (pWin, pFirstChange,
@@ -2236,11 +2168,7 @@ ConfigureWindow(WindowPtr pWin, Mask mask, XID *vlist, ClientPtr client)
     if ((mask & CWBorderWidth) && (bw != wBorderWidth(pWin)))
         goto ActuallyDoSomething;
     if (mask & CWStackMode) {
-#ifndef ROOTLESS
-        /* See above for why we always reorder in rootless mode. */
-        if (pWin->nextSib != pSib)
-#endif
-            goto ActuallyDoSomething;
+        goto ActuallyDoSomething;
     }
     return Success;
 
diff --git a/include/window.h b/include/window.h
index b6d61c3..df06b75 100644
--- a/include/window.h
+++ b/include/window.h
@@ -201,8 +201,8 @@ extern _X_EXPORT void CheckWindowOptionalNeed(WindowPtr /*w */ );
 
 extern _X_EXPORT Bool MakeWindowOptional(WindowPtr /*pWin */ );
 
-extern _X_EXPORT WindowPtr MoveWindowInStack(WindowPtr /*pWin */ ,
-                                             WindowPtr /*pNextSib */ );
+extern _X_EXPORT void MoveWindowInStack(WindowPtr /*pWin */ ,
+                                        WindowPtr /*pNextSib */ );
 
 extern _X_EXPORT void SetWinSize(WindowPtr /*pWin */ );
 
diff --git a/mi/mioverlay.c b/mi/mioverlay.c
index 2bfd5e4..b014d3d 100644
--- a/mi/mioverlay.c
+++ b/mi/mioverlay.c
@@ -911,7 +911,7 @@ miOverlayMoveWindow(WindowPtr pWin,
 {
     ScreenPtr pScreen = pWin->drawable.pScreen;
     miOverlayTreePtr pTree = MIOVERLAY_GET_WINDOW_TREE(pWin);
-    WindowPtr pParent, windowToValidate;
+    WindowPtr pParent, windowToValidate = pWin;
     Bool WasViewable = (Bool) (pWin->viewable);
     short bw;
     RegionRec overReg, underReg;
@@ -946,7 +946,7 @@ miOverlayMoveWindow(WindowPtr pWin,
 
     (*pScreen->PositionWindow) (pWin, x, y);
 
-    windowToValidate = MoveWindowInStack(pWin, pNextSib);
+    MoveWindowInStack(pWin, pNextSib);
 
     ResizeChildrenWinSize(pWin, x - oldpt.x, y - oldpt.y, 0, 0);
 
@@ -1101,7 +1101,7 @@ miOverlayResizeWindow(WindowPtr pWin,
     short dw, dh;
     DDXPointRec oldpt;
     RegionPtr oldRegion = NULL, oldRegion2 = NULL;
-    WindowPtr pFirstChange;
+    WindowPtr pFirstChange = pWin;
     WindowPtr pChild;
     RegionPtr gravitate[StaticGravity + 1];
     RegionPtr gravitate2[StaticGravity + 1];
@@ -1225,7 +1225,7 @@ miOverlayResizeWindow(WindowPtr pWin,
     /* let the hardware adjust background and border pixmaps, if any */
     (*pScreen->PositionWindow) (pWin, x, y);
 
-    pFirstChange = MoveWindowInStack(pWin, pSib);
+    MoveWindowInStack(pWin, pSib);
 
     if (WasViewable) {
         pRegion = RegionCreate(NullBox, 1);
diff --git a/mi/miwindow.c b/mi/miwindow.c
index 8dd99db..8adafdc 100644
--- a/mi/miwindow.c
+++ b/mi/miwindow.c
@@ -247,7 +247,7 @@ miMoveWindow(WindowPtr pWin, int x, int y, WindowPtr pNextSib, VTKind kind)
     DDXPointRec oldpt;
     Bool anyMarked = FALSE;
     ScreenPtr pScreen;
-    WindowPtr windowToValidate;
+    WindowPtr windowToValidate = pWin;
     WindowPtr pLayerWin;
 
     /* if this is a root window, can't be moved */
@@ -273,7 +273,7 @@ miMoveWindow(WindowPtr pWin, int x, int y, WindowPtr pNextSib, VTKind kind)
 
     (*pScreen->PositionWindow) (pWin, x, y);
 
-    windowToValidate = MoveWindowInStack(pWin, pNextSib);
+    MoveWindowInStack(pWin, pNextSib);
 
     ResizeChildrenWinSize(pWin, x - oldpt.x, y - oldpt.y, 0, 0);
 
@@ -350,7 +350,7 @@ miSlideAndSizeWindow(WindowPtr pWin,
     RegionPtr oldRegion = NULL;
     Bool anyMarked = FALSE;
     ScreenPtr pScreen;
-    WindowPtr pFirstChange;
+    WindowPtr pFirstChange = pWin;
     WindowPtr pChild;
     RegionPtr gravitate[StaticGravity + 1];
     unsigned g;
@@ -444,7 +444,7 @@ miSlideAndSizeWindow(WindowPtr pWin,
     /* let the hardware adjust background and border pixmaps, if any */
     (*pScreen->PositionWindow) (pWin, x, y);
 
-    pFirstChange = MoveWindowInStack(pWin, pSib);
+    MoveWindowInStack(pWin, pSib);
 
     if (WasViewable) {
         pRegion = RegionCreate(NullBox, 1);
-- 
1.8.3.1



More information about the xorg-devel mailing list