xserver: Branch 'master' - 3 commits

Keith Packard keithp at kemper.freedesktop.org
Tue Aug 14 17:15:21 PDT 2012


 dix/main.c                  |   18 +++++++++---------
 hw/xfree86/modes/xf86Crtc.c |   11 +++++++----
 render/filter.c             |    5 ++++-
 3 files changed, 20 insertions(+), 14 deletions(-)

New commits:
commit c0540b4c8db676d18a9a09828f1590b0b16f9ebc
Author: Keith Packard <keithp at keithp.com>
Date:   Tue Aug 7 17:49:48 2012 -0700

    Kludge -- Call RandR screen before cleaning up xf86 crtcs
    
    The core RandR screen cleanup now involves cleaning up any GPU screen
    associations, and those call down into DDX to clean up the driver. If
    the pointers from the xf86 structures back to the core randr
    structures are set to NULL at that point, bad things happen.
    
    This patch "knows" that the core RandR close screen is underneath the
    xf86 randr close screen function, and so makes sure it gets called
    first.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 154f684..1947c5b 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -726,6 +726,12 @@ xf86CrtcCloseScreen(ScreenPtr screen)
 
     xf86RotateCloseScreen(screen);
 
+    xf86RandR12CloseScreen(screen);
+
+    free(config->name);
+
+    screen->CloseScreen(screen);
+
     for (o = 0; o < config->num_output; o++) {
         xf86OutputPtr output = config->output[o];
 
@@ -749,10 +755,7 @@ xf86CrtcCloseScreen(ScreenPtr screen)
         else if (screen->current_master)
             DetachUnboundGPU(screen);
     }
-    xf86RandR12CloseScreen(screen);
-
-    free(config->name);
-    return screen->CloseScreen(screen);
+    return TRUE;
 }
 
 /*
commit 288b87e42cbb5db34cda848143655e84af8455da
Author: Keith Packard <keithp at keithp.com>
Date:   Tue Aug 7 17:49:47 2012 -0700

    Close GPU screens before core screens
    
    This should make cleaning up the GPU screens easier as the core
    screens they are associated with will still be around.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/dix/main.c b/dix/main.c
index 42f517d..fb935c9 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -331,6 +331,15 @@ main(int argc, char *argv[], char *envp[])
 
         CloseDownEvents();
 
+        for (i = screenInfo.numGPUScreens - 1; i >= 0; i--) {
+            ScreenPtr pScreen = screenInfo.gpuscreens[i];
+            FreeScratchPixmapsForScreen(pScreen);
+            (*pScreen->CloseScreen) (pScreen);
+            dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN);
+            free(pScreen);
+            screenInfo.numGPUScreens = i;
+        }
+
         for (i = screenInfo.numScreens - 1; i >= 0; i--) {
             FreeScratchPixmapsForScreen(screenInfo.screens[i]);
             FreeGCperDepth(i);
@@ -342,15 +351,6 @@ main(int argc, char *argv[], char *envp[])
             screenInfo.numScreens = i;
         }
 
-        for (i = screenInfo.numGPUScreens - 1; i >= 0; i--) {
-            ScreenPtr pScreen = screenInfo.gpuscreens[i];
-            FreeScratchPixmapsForScreen(pScreen);
-            (*pScreen->CloseScreen) (pScreen);
-            dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN);
-            free(pScreen);
-            screenInfo.numGPUScreens = i;
-        }
-
         ReleaseClientIds(serverClient);
         dixFreePrivates(serverClient->devPrivates, PRIVATE_CLIENT);
         serverClient->devPrivates = NULL;
commit 19772670e3041fe1c7f5bbf32fa039a6d8245ccb
Author: Keith Packard <keithp at keithp.com>
Date:   Tue Aug 7 17:49:46 2012 -0700

    Only free Render filter names on last screen close
    
    Hotplugging screens causes the render filter names to get freed while
    still in use; wait for the last core screen to be closed before
    freeing them. That only happens at server reset, when we want them to
    be freed.
    
    Signed-off-by: Keith Packard <keithp at keithp.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/render/filter.c b/render/filter.c
index 8c401ee..019ea7f 100644
--- a/render/filter.c
+++ b/render/filter.c
@@ -273,7 +273,10 @@ PictureResetFilters(ScreenPtr pScreen)
 
     free(ps->filters);
     free(ps->filterAliases);
-    PictureFreeFilterIds();
+
+    /* Free the filters when the last screen is closed */
+    if (pScreen->myNum == 0)
+        PictureFreeFilterIds();
 }
 
 int


More information about the xorg-commit mailing list