diff --git a/dix/dix_priv.h b/dix/dix_priv.h index ed0273dc1..44229bc08 100644 --- a/dix/dix_priv.h +++ b/dix/dix_priv.h @@ -263,4 +263,6 @@ void SetCriticalEvent(int event); void dixFreeScreen(ScreenPtr pScreen); +void dixFreeAllScreens(void); + #endif /* _XSERVER_DIX_PRIV_H */ diff --git a/dix/main.c b/dix/main.c index 1347ea5d4..5dbee7fdb 100644 --- a/dix/main.c +++ b/dix/main.c @@ -314,20 +314,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 c6fdfa3dc..fa5ff7d6c 100644 --- a/dix/screen.c +++ b/dix/screen.c @@ -9,7 +9,7 @@ #include "include/screenint.h" #include "include/scrnintstr.h" -void dixFreeScreen(ScreenPtr pScreen) +static void dixFreeScreen(ScreenPtr pScreen) { if (!pScreen) return; @@ -21,3 +21,18 @@ void dixFreeScreen(ScreenPtr pScreen) dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN); 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)); +}