diff --git a/dix/dix_priv.h b/dix/dix_priv.h index c3dc45fac..11a4c01e6 100644 --- a/dix/dix_priv.h +++ b/dix/dix_priv.h @@ -689,4 +689,6 @@ static inline ClientPtr dixLookupXIDOwner(XID xid) return NullClient; } +void dixFreeAllScreens(void); + #endif /* _XSERVER_DIX_PRIV_H */ diff --git a/dix/main.c b/dix/main.c index d87bb2368..4c2ccd50e 100644 --- a/dix/main.c +++ b/dix/main.c @@ -317,20 +317,8 @@ dix_main(int argc, char *argv[], char *envp[]) screenInfo.screens[i]->root = NullWindow; CloseDownDevices(); - CloseDownEvents(); - - for (i = screenInfo.numGPUScreens - 1; i >= 0; i--) { - dixFreeScreen(screenInfo.gpuscreens[i]); - screenInfo.numGPUScreens = i; - } - memset(&screenInfo.numGPUScreens, 0, sizeof(screenInfo.numGPUScreens)); - - for (i = screenInfo.numScreens - 1; i >= 0; i--) { - dixFreeScreen(screenInfo.screens[i]); - screenInfo.numScreens = i; - } - memset(&screenInfo.screens, 0, sizeof(screenInfo.numGPUScreens)); + dixFreeAllScreens(); ReleaseClientIds(serverClient); dixFreePrivates(serverClient->devPrivates, PRIVATE_CLIENT); diff --git a/dix/screen.c b/dix/screen.c index fe39a275c..44ac73125 100644 --- a/dix/screen.c +++ b/dix/screen.c @@ -10,7 +10,7 @@ #include "include/screenint.h" #include "include/scrnintstr.h" -void dixFreeScreen(ScreenPtr pScreen) +static void dixFreeScreen(ScreenPtr pScreen) { if (!pScreen) return; @@ -27,3 +27,18 @@ void dixFreeScreen(ScreenPtr pScreen) DeleteCallbackList(&pScreen->hookPixmapDestroy); free(pScreen); } + +void dixFreeAllScreens(void) +{ + for (int i = screenInfo.numGPUScreens - 1; i >= 0; i--) { + dixFreeScreen(screenInfo.gpuscreens[i]); + screenInfo.numGPUScreens = i; + } + memset(&screenInfo.numGPUScreens, 0, sizeof(screenInfo.numGPUScreens)); + + for (int i = screenInfo.numScreens - 1; i >= 0; i--) { + dixFreeScreen(screenInfo.screens[i]); + screenInfo.numScreens = i; + } + memset(&screenInfo.screens, 0, sizeof(screenInfo.numGPUScreens)); +}