From 658d81125793b4ae83074c3b1073b40ad46b738b Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Thu, 13 Mar 2025 16:54:20 +0100 Subject: [PATCH] dix: move screen destruction loop into dixFreeAllScreens() Consolidate the screen destruction code in its own function and so move it out of the big main loop. Signed-off-by: Enrico Weigelt, metux IT consult --- dix/dix_priv.h | 2 ++ dix/main.c | 14 +------------- dix/screen.c | 17 ++++++++++++++++- 3 files changed, 19 insertions(+), 14 deletions(-) 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)); +}