[osg-users] Crash on exit (graphics thread removing camera)

Robert Osfield robert.osfield at gmail.com
Mon Aug 15 01:20:01 PDT 2016


Hi Jannik,

A quick reply as I don't have time right now to look into the details
of this particular crash.

As a general note, the design of osgViewer assumes that viewer level
Camera's won't be added/removed while viewer threads are running.
It's easy to just call do something like:


    viewer->stopThreading();
    // reconfigure viewer/camera's
    viewer->startThreading();

The other approach is not not add or remove Camera's on the fly,
instead just assign them at the start of the viewer and then
enable/disable them via :

  Camera->setNodeMask(on?0xffffffff:0x0);

These two approaches might resolve the issue you have.

Robert.


On 14 August 2016 at 19:02, Jannik Heller <scrawl at baseoftrash.de> wrote:
> Hi,
>
> I just noticed a semi-random crash on exit in my application that seems to point to a design issue in OSG.
>
> In theory a crash can happen when you remove a previously used camera from the scene graph, then modify something in the subgraph of that camera (e.g. remove a node's child).
>
> The race condition comes from the clearReferencesToDependentCameras() call in the graphics thread. If the graphics thread held the last reference to that camera, then the camera will be deleted *from the graphics thread*. The camera destructor indirectly includes a call to releaseGLObjects() on the camera's sub graph. The releaseGLObjects() will crash if the sub graph is currently being modified by the main thread.
>
> Due to the race condition involved the crash is highly random so it's hard to make a reproducible example.
>
> I suspect we haven't noticed this crash in the past because clearReferencesToDependentCameras() used to be broken (see commit b5a3a580762ffbeb615d73ddff732f5e8fe487b7 ).
>
> Here's a stack trace:
>
>
> Code:
>
> Thread 2 (Thread 0x7f322525c700 (LWP 12096)):
> #0  0x00007f3232957ed9 in __libc_waitpid (pid=12105, stat_loc=0x7f322525b58c, options=0) at ../sysdeps/unix/sysv/linux/waitpid.c:40
>         resultvar = 12105
>         oldtype = 0
> #1  0x00000000009a758e in crash_catcher (signum=11, siginfo=<optimized out>, context=<optimized out>) at /home/scrawl/Dev/openmw/apps/openmw/crashcatcher.cpp:274
>         status = 0
>         dbg_pid = 12105
>         fd = {24, 25}
> #2  <signal handler called>
> No locals.
> #3  0x0000000000000000 in ?? ()
> No symbol table info available.
> #4  0x00007f3236a03dd3 in osg::Group::releaseGLObjects(osg::State*) const () from /home/scrawl/Dev/osg/build/install/lib64/libosg.so.145
> No symbol table info available.
> #5  0x00007f3236a03dd3 in osg::Group::releaseGLObjects(osg::State*) const () from /home/scrawl/Dev/osg/build/install/lib64/libosg.so.145
> No symbol table info available.
> #6  0x00007f3236a03dd3 in osg::Group::releaseGLObjects(osg::State*) const () from /home/scrawl/Dev/osg/build/install/lib64/libosg.so.145
> No symbol table info available.
> #7  0x00007f32369fd365 in osg::GraphicsContext::removeCamera(osg::Camera*) () from /home/scrawl/Dev/osg/build/install/lib64/libosg.so.145
> No symbol table info available.
> #8  0x00007f323699d0ef in osg::Camera::~Camera() () from /home/scrawl/Dev/osg/build/install/lib64/libosg.so.145
> No symbol table info available.
> #9  0x00007f323699d629 in osg::Camera::~Camera() () from /home/scrawl/Dev/osg/build/install/lib64/libosg.so.145
> No symbol table info available.
> #10 0x00007f323615ca01 in osgUtil::RenderStage::clearReferencesToDependentCameras() () from /home/scrawl/Dev/osg/build/install/lib64/libosgUtil.so.145
> No symbol table info available.
> #11 0x00007f3236168fa5 in osgUtil::SceneView::clearReferencesToDependentCameras() () from /home/scrawl/Dev/osg/build/install/lib64/libosgUtil.so.145
> No symbol table info available.
> #12 0x00007f3235a357d9 in osgViewer::Renderer::draw() () from /home/scrawl/Dev/osg/build/install/lib64/libosgViewer.so.145
> No symbol table info available.
> #13 0x00007f32369fed19 in osg::GraphicsContext::runOperations() () from /home/scrawl/Dev/osg/build/install/lib64/libosg.so.145
> No symbol table info available.
> #14 0x00007f3236a83b7a in osg::OperationThread::run() () from /home/scrawl/Dev/osg/build/install/lib64/libosg.so.145
> No symbol table info available.
> #15 0x00007f3236a01418 in osg::GraphicsThread::run() () from /home/scrawl/Dev/osg/build/install/lib64/libosg.so.145
> No symbol table info available.
> #16 0x00007f323666f8e5 in OpenThreads::ThreadPrivateActions::StartThread(void*) () from /home/scrawl/Dev/osg/build/install/lib64/libOpenThreads.so.20
> No symbol table info available.
>
>
>
>
> If I had to suggest a fix I'd suggest that the clear/collateReferencesToDependentCameras mechanism needs to be re-designed in a way that it's impossible for the graphics thread to delete the camera.
>
> Thank you!
>
> Cheers,
> Jannik
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=68367#68367
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org



More information about the osg-users mailing list