Well this patch is not correct since it leads to memory leaks, probably due to 
succeeding calls to dri_interface->getDrawableInfo. So I created the attached 
patch, but again valgrind warns for invalid reads.

Anyone understands why?

Thanks

P.S. Sorry but I am new to the code!

On Thursday 01 February 2007 19:19, Panagiotis Papadakos wrote:
> Checking with valgrind I got some invalid reads. The message was like the
> following:
>
> ==6988== Invalid read of size 4
> ==6988==    at 0x4B3C7FD: intersect_rect (radeon_state.c:61)
> ==6988==    by 0x4B3C9DA: radeonRecalcScissorRects (radeon_state.c:108)
> ==6988==    by 0x4B3CAEC: radeonUpdateScissor (radeon_state.c:131)
> ==6988==    by 0x4B3CD04: radeonEnable (radeon_state.c:205)
> ==6988==    by 0x4B4B1C1: r300Enable (r300_state.c:542)
> ==6988==    by 0x4D13827: _mesa_set_enable (enable.c:956)
> ==6988==    by 0x4D138A6: _mesa_Enable (enable.c:971)
> ==6988==    by 0x4769879: glEnable (glapitemp.h:1160)
> ==6988==    by 0x4613A5F:
> osgUtil::RenderStage::drawImplementation(osg::RenderInfo&,
> osgUtil::RenderLeaf*&) (in /usr/lib/libosgUtil.so) ==6988==    by
> 0x4607658: osgUtil::RenderBin::draw(osg::RenderInfo&,
> osgUtil::RenderLeaf*&) (in /usr/lib/libosgUtil.so) ==6988==    by
> 0x46133BC: osgUtil::RenderStage::drawInner(osg::RenderInfo&,
> osgUtil::RenderLeaf*&, bool&) (in /usr/lib/libosgUtil.so) ==6988==    by
> 0x4612E6C: osgUtil::RenderStage::draw(osg::RenderInfo&,
> osgUtil::RenderLeaf*&) (in /usr/lib/libosgUtil.so) ==6988==  Address
> 0x4AF585C is 4 bytes inside a block of size 8 free'd ==6988==    at
> 0x402303F: free (vg_replace_malloc.c:233)
> ==6988==    by 0x4BAF503: _mesa_free (imports.c:93)
> ==6988==    by 0x4B2FF84: __driUtilUpdateDrawableInfo (dri_util.c:430)
> ==6988==    by 0x4B2FD46: DoBindContext (dri_util.c:339)
> ==6988==    by 0x4B2FF00: driBindContext (dri_util.c:383)
> ==6988==    by 0x4735921: BindContextWrapper (glxext.c:1620)
> ==6988==    by 0x4735A53: MakeContextCurrent (glxext.c:1674)
> ==6988==    by 0x4735D7C: glXMakeCurrent (glxext.c:1796)
> ==6988==    by 0x47D8BB3: Producer::RenderSurface::makeCurrent(bool) (in
> /usr/lib/libProducer.so) ==6988==    by 0x47DEEC6:
> Producer::Camera::_frame(bool) (in /usr/lib/libProducer.so) ==6988==    by
> 0x47DF75F: Producer::Camera::frame(bool) (in /usr/lib/libProducer.so)
> ==6988==    by 0x47E2589: Producer::CameraGroup::_singleThreadedFrame() (in
> /usr/lib/libProducer.so)
>
> So I searched a bit, and I created the following patch, which touches
> src/mesa/drivers/dri/common/dri_util.c, and more specifically
> __driUtilUpdateDrawableInfo, calling _mesa_free for pdp->pClipRects and
> pdp->pBackClipRects only inside if.
>
> Does this look sane?
>
> Valgrind does not warn anymore.

-- 
Papadakos Panagiotis
--- src/mesa/drivers/dri/common/dri_util.c	2007-02-02 19:30:24.000000000 +0200
+++ src/mesa/drivers/dri/common/dri_util_new.c	2007-02-02 19:34:39.000000000 +0200
@@ -426,13 +426,11 @@
 	return;
     }
 
-    if (pdp->pClipRects) {
-	_mesa_free(pdp->pClipRects); 
-    }
-
-    if (pdp->pBackClipRects) {
-	_mesa_free(pdp->pBackClipRects); 
-    }
+    /* Temporary hold pointers, so that we don't leak 
+     * when (*dri_interface->getDrawableInfo) returns True
+     */
+    drm_clip_rect_t * tempPClipRects = pdp->pClipRects;
+    drm_clip_rect_t * tempPBackClipRects = pdp->pBackClipRects;
 
     DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
 
@@ -448,14 +446,29 @@
 	/* Error -- eg the window may have been destroyed.  Keep going
 	 * with no cliprects.
 	 */
-        pdp->pStamp = &pdp->lastStamp; /* prevent endless loop */
+
+	if (tempPClipRects) {
+	    _mesa_free(tempPClipRects);
+	}
+
+	if (tempPBackClipRects) {
+	    _mesa_free(tempPBackClipRects);
+	}
+
+	pdp->pStamp = &pdp->lastStamp; /* prevent endless loop */
 	pdp->numClipRects = 0;
 	pdp->pClipRects = NULL;
 	pdp->numBackClipRects = 0;
 	pdp->pBackClipRects = NULL;
     }
     else
-       pdp->pStamp = &(psp->pSAREA->drawableTable[pdp->index].stamp);
+    {
+	if(tempPClipRects)
+	    _mesa_free(tempPClipRects);
+	if(tempPBackClipRects)
+	    _mesa_free(tempPBackClipRects);
+        pdp->pStamp = &(psp->pSAREA->drawableTable[pdp->index].stamp);
+    }
 
     DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
 
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to