Hi Richard,
I have made some changes to Referenced, OpenThreads and the various
addParent/removeParent codes to make sure that mutex is used to
protect access to these methods even when atomic ref counting is
enabled.
The solution I opted for was to have a static
Referenced::getGlobalReferencedMutex() method that which is used get
Referenced::getRefMutext() when using atomic ref counting, rather than
the NULL that was be passed back previously. To keep the
addParent/removeParent() codes simpler and more reliable I have
introduced an OpenThreads::ScopedPointerLock() which takes a pointer
to a mutex rather than a reference to a mutex. This removes the
if/else block, so the code now looks like:
void Node::addParent(osg::Group* node)
{
OpenThreads::ScopedPointerLock<OpenThreads::Mutex> lock(getRefMutex());
_parents.push_back(node);
}
void Node::removeParent(osg::Group* node)
{
OpenThreads::ScopedPointerLock<OpenThreads::Mutex> lock(getRefMutex());
ParentList::iterator pitr = std::find(_parents.begin(),_parents.end(),node);
if (pitr!=_parents.end()) _parents.erase(pitr);
}
The StateAttribute::addParent/removeParent wasn't previous protected
by a mutex lock so I've added the above usage style to it as well.
These changes should hopefully fix the lack of thread safety
associated with adding/removing objects parents.
Richard, could you please try out the svn/trunk version and see if
these changes fix things at your end.
Robert.
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org