From: Pauli Nieminen <[email protected]>

Calling BlockHandlers takes some time for each iteration in main loop
which adds up quickly over multiple request. To reduce the round-trip
costs to xserver BlockHandlers should be registered only when required.

AnimCurScreenBlockHandler is the first victim for this optimization.

Signed-off-by: Pauli Nieminen <[email protected]>
---
 render/animcur.c |   18 +++++++++++++-----
 1 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/render/animcur.c b/render/animcur.c
index 1a8ca43..31cbab9 100644
--- a/render/animcur.c
+++ b/render/animcur.c
@@ -95,8 +95,6 @@ AnimCurCloseScreen (int index, ScreenPtr pScreen)
     Bool                ret;
 
     Unwrap(as, pScreen, CloseScreen);
-    
-    Unwrap(as, pScreen, BlockHandler);
 
     Unwrap(as, pScreen, CursorLimits);
     Unwrap(as, pScreen, DisplayCursor);
@@ -196,7 +194,10 @@ AnimCurScreenBlockHandler (int screenNum,
 
     Unwrap (as, pScreen, BlockHandler);
     (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
-    Wrap (as, pScreen, BlockHandler, AnimCurScreenBlockHandler);
+    if (activeDevice)
+        Wrap (as, pScreen, BlockHandler, AnimCurScreenBlockHandler);
+    else
+        as->BlockHandler = NULL;
 }
 
 static Bool
@@ -222,6 +223,9 @@ AnimCurDisplayCursor (DeviceIntPtr pDev,
                pDev->spriteInfo->anim.time = GetTimeInMillis () + 
ac->elts[0].delay;
                pDev->spriteInfo->anim.pCursor = pCursor;
                pDev->spriteInfo->anim.pScreen = pScreen;
+
+               if (!as->BlockHandler)
+                   Wrap(as, pScreen, BlockHandler, AnimCurScreenBlockHandler);
            }
        }
        else
@@ -248,8 +252,12 @@ AnimCurSetCursorPosition (DeviceIntPtr pDev,
     Bool               ret;
     
     Unwrap (as, pScreen, SetCursorPosition);
-    if (pDev->spriteInfo->anim.pCursor)
+    if (pDev->spriteInfo->anim.pCursor) {
        pDev->spriteInfo->anim.pScreen = pScreen;
+
+       if (!as->BlockHandler)
+           Wrap(as, pScreen, BlockHandler, AnimCurScreenBlockHandler);
+    }
     ret = (*pScreen->SetCursorPosition) (pDev, pScreen, x, y, generateEvent);
     Wrap (as, pScreen, SetCursorPosition, AnimCurSetCursorPosition);
     return ret;
@@ -334,7 +342,7 @@ AnimCurInit (ScreenPtr pScreen)
        return FALSE;
     Wrap(as, pScreen, CloseScreen, AnimCurCloseScreen);
 
-    Wrap(as, pScreen, BlockHandler, AnimCurScreenBlockHandler);
+    as->BlockHandler = NULL;
 
     Wrap(as, pScreen, CursorLimits, AnimCurCursorLimits);
     Wrap(as, pScreen, DisplayCursor, AnimCurDisplayCursor);
-- 
1.7.0.4

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to