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 &&