From 63485bcc026097c37047d33e1e709baf70470f8f Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Fri, 4 Oct 2024 16:05:09 +0200 Subject: [PATCH] Xext: shm: use PixmapDestroy hook Wrapping ScreenRec's function pointers is problematic for many reasons, so use the new pixmap destroy notify hook instead. Signed-off-by: Enrico Weigelt, metux IT consult --- Xext/shm.c | 45 +++++++++++++-------------------------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/Xext/shm.c b/Xext/shm.c index c698bb591..39ff0ca48 100644 --- a/Xext/shm.c +++ b/Xext/shm.c @@ -98,7 +98,6 @@ in this Software without prior written authorization from The Open Group. typedef struct _ShmScrPrivateRec { ShmFuncsPtr shmFuncs; - DestroyPixmapProcPtr destroyPixmap; } ShmScrPrivateRec; Bool noMITShmExtension = FALSE; @@ -109,8 +108,6 @@ static void ShmResetProc(ExtensionEntry *extEntry); static void SShmCompletionEvent(xShmCompletionEvent *from, xShmCompletionEvent *to); -static Bool ShmDestroyPixmap(PixmapPtr pPixmap); - static unsigned char ShmReqCode; int ShmCompletionCode; int BadShmSegCode; @@ -244,28 +241,6 @@ ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs) ShmInitScreenPriv(pScreen)->shmFuncs = funcs; } -static Bool -ShmDestroyPixmap(PixmapPtr pPixmap) -{ - ScreenPtr pScreen = pPixmap->drawable.pScreen; - ShmScrPrivateRec *screen_priv = ShmGetScreenPriv(pScreen); - void *shmdesc = NULL; - Bool ret = TRUE; - - if (pPixmap->refcnt == 1) - shmdesc = dixLookupPrivate(&pPixmap->devPrivates, shmPixmapPrivateKey); - - pScreen->DestroyPixmap = screen_priv->destroyPixmap; - if (pScreen->DestroyPixmap) - ret = pScreen->DestroyPixmap(pPixmap); - screen_priv->destroyPixmap = pScreen->DestroyPixmap; - pScreen->DestroyPixmap = ShmDestroyPixmap; - - if (shmdesc) - ShmDetachSegment(shmdesc, 0); - - return ret; -} void ShmRegisterFbFuncs(ScreenPtr pScreen) @@ -434,6 +409,9 @@ ShmDetachSegment(void *value, /* must conform to DeleteType */ ShmDescPtr shmdesc = (ShmDescPtr) value; ShmDescPtr *prev; + if (!shmdesc) + return Success; + if (--shmdesc->refcnt) return TRUE; #if SHM_FD_PASSING @@ -1511,6 +1489,14 @@ SProcShmDispatch(ClientPtr client) } } +static void ShmPixmapDestroy(CallbackListPtr *pcbl, ScreenPtr pScreen, PixmapPtr pPixmap) +{ + ShmDetachSegment( + dixLookupPrivate(&pPixmap->devPrivates, shmPixmapPrivateKey), + 0); + dixSetPrivate(&pPixmap->devPrivates, shmPixmapPrivateKey, NULL); +} + void ShmExtensionInit(void) { @@ -1541,13 +1527,8 @@ ShmExtensionInit(void) sharedPixmaps = xFalse; } if (sharedPixmaps) - for (i = 0; i < screenInfo.numScreens; i++) { - ShmScrPrivateRec *screen_priv = - ShmGetScreenPriv(screenInfo.screens[i]); - screen_priv->destroyPixmap = - screenInfo.screens[i]->DestroyPixmap; - screenInfo.screens[i]->DestroyPixmap = ShmDestroyPixmap; - } + for (i = 0; i < screenInfo.numScreens; i++) + dixScreenHookPixmapDestroy(screenInfo.screens[i], ShmPixmapDestroy); } ShmSegType = CreateNewResourceType(ShmDetachSegment, "ShmSeg"); if (ShmSegType &&