dix: consolidate screen destruction in dixFreeScreen()

Consolidate duplicated screen destruction logic into new function
dixFreeScreen().

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:28:05 +01:00
parent 14de20ce58
commit a110b3e02e
4 changed files with 30 additions and 11 deletions

View File

@ -268,6 +268,8 @@ extern Bool enableBackingStore;
/* in generated BuiltInAtoms.c */ /* in generated BuiltInAtoms.c */
void MakePredeclaredAtoms(void); void MakePredeclaredAtoms(void);
void dixFreeScreen(ScreenPtr pScreen);
/* /*
* @brief mark event ID as critical * @brief mark event ID as critical
* @param event the event to add to the critical events bitmap * @param event the event to add to the critical events bitmap

View File

@ -325,23 +325,16 @@ dix_main(int argc, char *argv[], char *envp[])
CloseDownEvents(); CloseDownEvents();
for (i = screenInfo.numGPUScreens - 1; i >= 0; i--) { for (i = screenInfo.numGPUScreens - 1; i >= 0; i--) {
ScreenPtr pScreen = screenInfo.gpuscreens[i]; dixFreeScreen(screenInfo.gpuscreens[i]);
dixFreeScreenSpecificPrivates(pScreen);
(*pScreen->CloseScreen) (pScreen);
dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN);
free(pScreen);
screenInfo.numGPUScreens = i; screenInfo.numGPUScreens = i;
} }
memset(&screenInfo.numGPUScreens, 0, sizeof(screenInfo.numGPUScreens));
for (i = screenInfo.numScreens - 1; i >= 0; i--) { for (i = screenInfo.numScreens - 1; i >= 0; i--) {
FreeGCperDepth(screenInfo.screens[i]); dixFreeScreen(screenInfo.screens[i]);
dixDestroyPixmap(screenInfo.screens[i]->defaultStipple, 0);
dixFreeScreenSpecificPrivates(screenInfo.screens[i]);
(*screenInfo.screens[i]->CloseScreen) (screenInfo.screens[i]);
dixFreePrivates(screenInfo.screens[i]->devPrivates, PRIVATE_SCREEN);
free(screenInfo.screens[i]);
screenInfo.numScreens = i; screenInfo.numScreens = i;
} }
memset(&screenInfo.screens, 0, sizeof(screenInfo.numGPUScreens));
ReleaseClientIds(serverClient); ReleaseClientIds(serverClient);
dixFreePrivates(serverClient->devPrivates, PRIVATE_CLIENT); dixFreePrivates(serverClient->devPrivates, PRIVATE_CLIENT);

View File

@ -28,6 +28,7 @@ srcs_dix = [
'registry.c', 'registry.c',
'resource.c', 'resource.c',
'selection.c', 'selection.c',
'screen.c',
'swaprep.c', 'swaprep.c',
'swapreq.c', 'swapreq.c',
'tables.c', 'tables.c',

23
dix/screen.c Normal file
View File

@ -0,0 +1,23 @@
/* SPDX-License-Identifier: MIT OR X11
*
* Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
*/
#include <dix-config.h>
#include "dix/dix_priv.h"
#include "dix/gc_priv.h"
#include "include/screenint.h"
#include "include/scrnintstr.h"
void dixFreeScreen(ScreenPtr pScreen)
{
if (!pScreen)
return;
FreeGCperDepth(pScreen);
dixDestroyPixmap(pScreen->defaultStipple, 0);
dixFreeScreenSpecificPrivates(pScreen);
pScreen->CloseScreen(pScreen);
dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN);
free(pScreen);
}