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 <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2025-03-13 16:54:20 +01:00
parent 922a22b6ef
commit 658d811257
3 changed files with 19 additions and 14 deletions

View File

@ -689,4 +689,6 @@ static inline ClientPtr dixLookupXIDOwner(XID xid)
return NullClient;
}
void dixFreeAllScreens(void);
#endif /* _XSERVER_DIX_PRIV_H */

View File

@ -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);

View File

@ -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));
}