Hi Dario,

The stack trace suggests a problem with the parent list.  The code you've
supplied itself in principle looks OK, although generally when doing this
type of work I don't use callbacks, instead placing the sync in a separate
call in in the viewer's frame - i.e. how the DatabasePager works.  One can
use an viewer UpdateOperation for this type of scene graph sync work.

W.r.t the parent list adjustment causing a race condition.  At least in
last few releases of the OSG there has been a mutex to protect access
add/remove from the parent list.  Which version of the OSG are you using?
Check to see whether it's got the appropriate mutex code in the
Node::addParent()/removeParent().

Robert.

On 17 December 2015 at 16:56, Dario Minieri <para...@cheapnet.it> wrote:

> Hi,
>
> I have a system which use an UpdateCallback for every node which can be
> modified (adding or removing his children).  Sometime I have segmentation
> fault inside the callback, like this one:
>
> #0  0x00007ffff4b02cc9 in __GI_raise (sig=sig@entry=6) at
> ../nptl/sysdeps/unix/sysv/linux/raise.c:56
> #1  0x00007ffff4b060d8 in __GI_abort () at abort.c:89
> #2  0x00007ffff5107535 in __gnu_cxx::__verbose_terminate_handler() () from
> /usr/lib/x86_64-linux-gnu/libstdc++.so.6
> #3  0x00007ffff51056d6 in ?? () from
> /usr/lib/x86_64-linux-gnu/libstdc++.so.6
> #4  0x00007ffff5105703 in std::terminate() () from
> /usr/lib/x86_64-linux-gnu/libstdc++.so.6
> #5  0x00007ffff5105922 in __cxa_throw () from
> /usr/lib/x86_64-linux-gnu/libstdc++.so.6
> #6  0x00007ffff5105e0d in operator new(unsigned long) () from
> /usr/lib/x86_64-linux-gnu/libstdc++.so.6
> #7  0x00007ffff0e83ac6 in std::vector<osg::Group*,
> std::allocator<osg::Group*>
> >::_M_insert_aux(__gnu_cxx::__normal_iterator<osg::Group**,
> std::vector<osg::Group*, std::allocator<osg::Group*> > >, osg::Group*
> const&) () from /usr/local/lib/libosg.so.100
> #8  0x00007ffff0e83266 in osg::Node::addParent(osg::Group*) () from
> /usr/local/lib/libosg.so.100
> #9  0x00007ffff0e14bad in osg::Group::insertChild(unsigned int,
> osg::Node*) () from /usr/local/lib/libosg.so.100
> #10 0x00007ffff488501f in AlterTreeNodeCallback::operator()(osg::Node*,
> osg::NodeVisitor*) () from /usr/local/lib/libSimWorld.so
> #11 0x00007ffff0e150b2 in osg::Group::accept(osg::NodeVisitor&) () from
> /usr/local/lib/libosg.so.100
> #12 0x00007ffff0e13af3 in osg::Group::traverse(osg::NodeVisitor&) () from
> /usr/local/lib/libosg.so.100
> #13 0x00007ffff0e150b2 in osg::Group::accept(osg::NodeVisitor&) () from
> /usr/local/lib/libosg.so.100
> #14 0x00007ffff0e13af3 in osg::Group::traverse(osg::NodeVisitor&) () from
> /usr/local/lib/libosg.so.100
> #15 0x00007ffff0e150b2 in osg::Group::accept(osg::NodeVisitor&) () from
> /usr/local/lib/libosg.so.100
> #16 0x00007fffeff514a1 in osgViewer::Viewer::updateTraversal() () from
> /usr/local/lib/libosgViewer.so.100
> #17 0x00007fffeff5b685 in osgViewer::ViewerBase::frame(double) () from
> /usr/local/lib/libosgViewer.so.100
> #18 0x00007ffff04356e4 in QGLWidget::glDraw() () from
> /usr/lib/x86_64-linux-gnu/libQt5OpenGL.so.5
> #19 0x00007ffff04326f9 in QGLWidget::paintEvent(QPaintEvent*) () from
> /usr/lib/x86_64-linux-gnu/libQt5OpenGL.so.5
> #20 0x00007ffff5521302 in QWidget::event(QEvent*) () from
> /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
> #21 0x00007ffff54e5c8c in QApplicationPrivate::notify_helper(QObject*,
> QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
> #22 0x00007ffff54eae56 in QApplication::notify(QObject*, QEvent*) () from
> /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
> #23 0x00007ffff6488c2d in QCoreApplication::notifyInternal(QObject*,
> QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
> #24 0x00007ffff551bbea in QWidgetPrivate::drawWidget(QPaintDevice*,
> QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) ()
>    from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
>
> Adding (insertChild) some new node at runtime, show the problem. This
> happens especially when I made some remove and insert in short time.
>
> The callback is something like this:
>
>
> Code:
> void AlterCallback::operator()(Node* p_node, NodeVisitor* p_nv) {
>   if (p_node != NULL) {
>     Group* p_group = p_node->asGroup();
>     if (p_group != NULL) {
>       while (m_add_nodes.size() > 0) {
>           Node* l_node = (Node*)m_add_nodes.popFront();
>           p_group->addChild(l_node);
>         }
>
>       while (m_remove_nodes.size() > 0) {
>         Node* l_node = (Node*)m_remove_nodes.popFront();
>         p_group->removeChild(l_node);
>       }
>     }
>
>     traverse(p_node, p_nv);
>   }
> }
>
>
>
> m_add_nodes and m_remove_nodes are thread-safe structures which holds the
> list of nodes (pointers) to add and remove.
>
> This is a good way to alter the tree at runtime?
>
> Thank you!
>
> Cheers,
> Dario
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=65891#65891
>
>
>
>
>
> _______________________________________________
> 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

Reply via email to