Compare commits

...

5 Commits

Author SHA1 Message Date
Enrico Weigelt, metux IT consult 968478e5aa 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>
2025-05-15 19:22:13 +02:00
Enrico Weigelt, metux IT consult 6ca37d6c8c 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>
2025-05-15 19:22:13 +02:00
Enrico Weigelt, metux IT consult b05fc4f013 dix: replace FreeDefaultStipple()
It's just a one-liner only called once, so no actual need for it.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-15 19:22:13 +02:00
Enrico Weigelt, metux IT consult 92fbd59a57 dix: let FreeGCperDepth() operate on ScreenPtr and NULL protect it
Instead of retrieving the screen index from ScreenRec and passing this,
so the ScreenRec is looked up again, just pass in the ScreenPtr that
already have anyways.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-15 19:22:13 +02:00
Enrico Weigelt, metux IT consult 4beeee4e3d dix: NULL-protect FreeGC()
Make it possible to call FreeGC() w/o prior NULL checks.
In case of NULL, BadMatch is returned.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-05-15 19:22:13 +02:00
6 changed files with 49 additions and 33 deletions

View File

@ -255,4 +255,6 @@ extern Bool enableBackingStore;
/* in generated BuiltInAtoms.c */ /* in generated BuiltInAtoms.c */
void MakePredeclaredAtoms(void); void MakePredeclaredAtoms(void);
void dixFreeAllScreens(void);
#endif /* _XSERVER_DIX_PRIV_H */ #endif /* _XSERVER_DIX_PRIV_H */

View File

@ -768,6 +768,8 @@ int
FreeGC(void *value, XID gid) FreeGC(void *value, XID gid)
{ {
GCPtr pGC = (GCPtr) value; GCPtr pGC = (GCPtr) value;
if (!pGC)
return BadMatch;
CloseFont(pGC->font, (Font) 0); CloseFont(pGC->font, (Font) 0);
if (pGC->funcs) if (pGC->funcs)
@ -819,13 +821,14 @@ CreateScratchGC(ScreenPtr pScreen, unsigned depth)
} }
void void
FreeGCperDepth(int screenNum) FreeGCperDepth(ScreenPtr pScreen)
{ {
int i; int i;
ScreenPtr pScreen;
GCPtr *ppGC; GCPtr *ppGC;
pScreen = screenInfo.screens[screenNum]; if (!pScreen)
return;
ppGC = pScreen->GCperDepth; ppGC = pScreen->GCperDepth;
for (i = 0; i <= pScreen->numDepths; i++) { for (i = 0; i <= pScreen->numDepths; i++) {
@ -900,13 +903,6 @@ CreateDefaultStipple(int screenNum)
return TRUE; return TRUE;
} }
void
FreeDefaultStipple(int screenNum)
{
ScreenPtr pScreen = screenInfo.screens[screenNum];
dixDestroyPixmap(pScreen->defaultStipple, 0);
}
int int
SetDashes(GCPtr pGC, unsigned offset, unsigned ndash, unsigned char *pdash) SetDashes(GCPtr pGC, unsigned offset, unsigned ndash, unsigned char *pdash)
{ {

View File

@ -22,14 +22,12 @@ int CopyGC(GCPtr pgcSrc, GCPtr pgcDst, BITS32 mask);
int FreeGC(void *pGC, XID gid); int FreeGC(void *pGC, XID gid);
void FreeGCperDepth(int screenNum); void FreeGCperDepth(ScreenPtr pScreen);
Bool CreateGCperDepth(int screenNum); Bool CreateGCperDepth(int screenNum);
Bool CreateDefaultStipple(int screenNum); Bool CreateDefaultStipple(int screenNum);
void FreeDefaultStipple(int screenNum);
int SetDashes(GCPtr pGC, unsigned offset, unsigned ndash, unsigned char *pdash); int SetDashes(GCPtr pGC, unsigned offset, unsigned ndash, unsigned char *pdash);
int VerifyRectOrder(int nrects, xRectangle *prects, int ordering); int VerifyRectOrder(int nrects, xRectangle *prects, int ordering);

View File

@ -314,27 +314,8 @@ dix_main(int argc, char *argv[], char *envp[])
screenInfo.screens[i]->root = NullWindow; screenInfo.screens[i]->root = NullWindow;
CloseDownDevices(); CloseDownDevices();
CloseDownEvents(); CloseDownEvents();
dixFreeAllScreens();
for (i = screenInfo.numGPUScreens - 1; i >= 0; i--) {
ScreenPtr pScreen = screenInfo.gpuscreens[i];
dixFreeScreenSpecificPrivates(pScreen);
(*pScreen->CloseScreen) (pScreen);
dixFreePrivates(pScreen->devPrivates, PRIVATE_SCREEN);
free(pScreen);
screenInfo.numGPUScreens = i;
}
for (i = screenInfo.numScreens - 1; i >= 0; i--) {
FreeGCperDepth(i);
FreeDefaultStipple(i);
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;
}
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',

38
dix/screen.c Normal file
View File

@ -0,0 +1,38 @@
/* 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"
static 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);
}
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));
}