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 <scr...@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@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org