Hi Csaba,

I have finally cleared through my inbox to looking closely at this
issue and the suggested bug fix.  I believe your suggested change is
safe in normal execution for CullThreadPerCameraDrawThreadPerContext
and DrawThreadPerContext, as the the _startRenderingBarrier barrier
being joined will be holding back the graphics threads, and calling
the reset of the block before joing this barrier will only release the
graphics threads to join this barrier - they can't go one to next
frame till the main thread joins the barrier.

WIth your patch applied all the OSG example still run fine even when I
CullThreadPerCameraDrawThreadPerContext, but then these run OK before
anyway... so it's no 100% confirmation of a fix, but it's also close
as I can get without ever having reproduced the hang myself.  Such is
the way with threading bugs...

My thanks for your perseverance on this.  The fix is now checked into
svn and will be part of 2.7.5 dev release.  I also fixed the type of
ThreadSafeQueue as well.


On Fri, Oct 17, 2008 at 4:02 PM, Csaba Halász <[EMAIL PROTECTED]> wrote:
> On Thu, Oct 16, 2008 at 2:42 PM, Robert Osfield
> <[EMAIL PROTECTED]> wrote:
>> HI Csaba,
>> I suspect the particular problem you are seeing is not directly driver
>> related, but is an OSG bug, differences in drivers might change the
>> timing slightly which leads to the problem not becoming visible, but
>> may well still be lurking.
> Hi Robert,
> Huh, took me two days, but I think I have traced this to a race condition.
> Apparently the _endDynamicDrawBlock was already reached by a graphics
> thread before the viewer got a chance to reset it.
> So then that draw thread was released (and subsequently blocked on the
> sceneview queue) and the viewer has gone to infinite wait on the
> _endDynamicDrawBlock later.
> This simpe patch (that doesn't even hint at how difficult it is to
> trace such bugs) seems to fix the issue here:
> Index: src/osgViewer/ViewerBase.cpp
> ===================================================================
> --- src/osgViewer/ViewerBase.cpp        (revision 9034)
> +++ src/osgViewer/ViewerBase.cpp        (working copy)
> @@ -674,14 +674,14 @@
>     bool doneMakeCurrentInThisThread = false;
> -    // dispatch the the rendering threads
> -    if (_startRenderingBarrier.valid()) _startRenderingBarrier->block();
> -
>     if (_endDynamicDrawBlock.valid())
>     {
>         _endDynamicDrawBlock->reset();
>     }
> +    // dispatch the the rendering threads
> +    if (_startRenderingBarrier.valid()) _startRenderingBarrier->block();
> +
>     // reset any double buffer graphics objects
>     for(Cameras::iterator camItr = cameras.begin();
>         camItr != cameras.end();
> I am not even sure why the _endDynamicDrawBlock has to be reset. Comments?
> --
> Csaba
> _______________________________________________
> osg-users mailing list
> osg-users@lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
osg-users mailing list

Reply via email to