Ian Romanick wrote:
Keith Whitwell wrote:

The other bug report I've had is triggered in similar circumstances, but goes into an infinite loop inside DRI_VALIDATE_DRAWABLE_INFO(), as a magic stamp value never gets updated because the X protocol message never succeeds -- but it doesn't segfault.

I've got a patch that solves (I hope) that problem, but I'm not sure working around this is a good idea as it seems to result from maybe a double free somewhere...

Yes. The light-05 test in viewperf shows this bug on r200. If you want to send me your patch, I can try it out.
There are now two patches, one from Egbert Eich (who reported the problem). I haven't had time to look at his as it changes some deep, dark, dri stuff that I wasn't ever involved with, but looks sane nonetheless. His avoids the error reply from the X server, whereas mine copes with it once it arrives. I'm not sure either will help texobj which seems to be a malloc/free bug.

I'm attaching both. I actually think applying *both* is the way to go.

Keith


--- dri_util.c 2002/11/25 14:26:55 1.1.1.3
+++ dri_util.c 2003/02/05 10:17:40
@@ -758,8 +762,8 @@
psp->fullscreen = NULL;
}
}
- __driGarbageCollectDrawables(pcp->driScreenPriv->drawHash);
(*pcp->driScreenPriv->DriverAPI.DestroyContext)(pcp);
+ __driGarbageCollectDrawables(pcp->driScreenPriv->drawHash);
(void)XF86DRIDestroyContext(dpy, scrn, pcp->contextID);
Xfree(pcp);
}

Warning: Remote host denied X11 forwarding.
Index: dri_util.c
===================================================================
RCS file: /cvsroot/dri/xc/xc/lib/GL/dri/dri_util.c,v
retrieving revision 1.6
diff -u -r1.6 dri_util.c
--- dri_util.c  28 Nov 2002 19:16:45 -0000      1.6
+++ dri_util.c  4 Feb 2003 23:06:41 -0000
@@ -618,16 +618,20 @@
                                &pdp->numBackClipRects,
                                &pdp->pBackClipRects
                                 )) {
+       /* Error -- eg the window may have been destroyed.  Keep going
+        * with no cliprects.
+        */
+        pdp->pStamp = &pdp->lastStamp; /* prevent endless loop */
        pdp->numClipRects = 0;
        pdp->pClipRects = NULL;
        pdp->numBackClipRects = 0;
        pdp->pBackClipRects = 0;
-       /* ERROR!!! */
     }
+    else
+       pdp->pStamp = &(psp->pSAREA->drawableTable[pdp->index].stamp);
 
     DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
 
-    pdp->pStamp = &(psp->pSAREA->drawableTable[pdp->index].stamp);
 }
 
 /*****************************************************************/

Reply via email to