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