Hi, * Robert Osfield -- Friday 06 February 2009: > The code in osgParticle::ParticleSystemUpdater has changed very little > over the past two years, so I think it's unlikely to be a specific > problem with osgParticle in OSG2.8/svn/trunk,
I didn't claim that it's a particle bug -- just that it regularly happens in the particle code. The bt implies that it's a threading bug. > Also try the OSG examples with particle systems such as > osgparticleeffects, osgparticle and osgcatch. I'm a lazy bum and just let valgrind's threading debugger helgrind run over osgparticleeffects. Result attached (from osg r9676). Summary: $ valgrind --tool=helgrind ./osgparticleeffects ==31276== Helgrind, a thread error detector. [...] ==31276== Thread #1: lock order "0x58F499C before 0x58F494C" violated [...] ==31276== Thread #1: lock order "0x58F6A9C before 0x58F6AEC" violated [...] ==31276== ERROR SUMMARY: 512 errors from 2 contexts (suppressed: 0 from 0) m.
==31276== Helgrind, a thread error detector. ==31276== Copyright (C) 2007-2008, and GNU GPL'd, by OpenWorks LLP et al. ==31276== Using LibVEX rev 1883, a library for dynamic binary translation. ==31276== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP. ==31276== Using valgrind-3.5.0.SVN, a dynamic binary instrumentation framework. ==31276== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al. ==31276== For more details, rerun with: -v ==31276== ==31276== Thread #1 is the program's root thread ==31276== ==31276== Thread #1: lock order "0x58F499C before 0x58F494C" violated ==31276== at 0x4025D47: pthread_mutex_lock (hg_intercepts.c:409) ==31276== by 0x4030D86: OpenThreads::Mutex::lock() (PThreadMutex.c++:122) ==31276== by 0x45C4D4C: OpenThreads::ReadWriteMutex::readUnlock() (ScopedLock:31) ==31276== by 0x45C2BBE: osgParticle::ParticleSystem::drawImplementation(osg::RenderInfo&) const (ReadWriteMutex:90) ==31276== by 0x43E48C3: osgUtil::RenderLeaf::render(osg::RenderInfo&, osgUtil::RenderLeaf*) (Drawable:898) ==31276== by 0x43DF2DD: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:419) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43DF36E: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:469) ==31276== by 0x43E6FF3: osgUtil::RenderStage::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1251) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43E811D: osgUtil::RenderStage::drawInner(osg::RenderInfo&, osgUtil::RenderLeaf*&, bool&) (RenderStage.cpp:845) ==31276== by 0x43EB505: osgUtil::RenderStage::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1108) ==31276== Required order was established by acquisition of lock at 0x58F499C ==31276== at 0x4025D47: pthread_mutex_lock (hg_intercepts.c:409) ==31276== by 0x4030D86: OpenThreads::Mutex::lock() (PThreadMutex.c++:122) ==31276== by 0x45C4DE4: OpenThreads::ReadWriteMutex::readLock() (ScopedLock:31) ==31276== by 0x45C2AFA: osgParticle::ParticleSystem::drawImplementation(osg::RenderInfo&) const (ReadWriteMutex:89) ==31276== by 0x43E48C3: osgUtil::RenderLeaf::render(osg::RenderInfo&, osgUtil::RenderLeaf*) (Drawable:898) ==31276== by 0x43DF2DD: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:419) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43DF36E: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:469) ==31276== by 0x43E6FF3: osgUtil::RenderStage::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1251) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43E811D: osgUtil::RenderStage::drawInner(osg::RenderInfo&, osgUtil::RenderLeaf*&, bool&) (RenderStage.cpp:845) ==31276== by 0x43EB505: osgUtil::RenderStage::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1108) ==31276== followed by a later acquisition of lock at 0x58F494C ==31276== at 0x4025D47: pthread_mutex_lock (hg_intercepts.c:409) ==31276== by 0x4030D86: OpenThreads::Mutex::lock() (PThreadMutex.c++:122) ==31276== by 0x45C4DFD: OpenThreads::ReadWriteMutex::readLock() (ReadWriteMutex:37) ==31276== by 0x45C2AFA: osgParticle::ParticleSystem::drawImplementation(osg::RenderInfo&) const (ReadWriteMutex:89) ==31276== by 0x43E48C3: osgUtil::RenderLeaf::render(osg::RenderInfo&, osgUtil::RenderLeaf*) (Drawable:898) ==31276== by 0x43DF2DD: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:419) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43DF36E: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:469) ==31276== by 0x43E6FF3: osgUtil::RenderStage::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1251) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43E811D: osgUtil::RenderStage::drawInner(osg::RenderInfo&, osgUtil::RenderLeaf*&, bool&) (RenderStage.cpp:845) ==31276== by 0x43EB505: osgUtil::RenderStage::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1108) ==31276== ==31276== Thread #1: lock order "0x58F6A9C before 0x58F6AEC" violated ==31276== at 0x4025D47: pthread_mutex_lock (hg_intercepts.c:409) ==31276== by 0x4030D86: OpenThreads::Mutex::lock() (PThreadMutex.c++:122) ==31276== by 0x45C4DFD: OpenThreads::ReadWriteMutex::readLock() (ReadWriteMutex:37) ==31276== by 0x45C2AFA: osgParticle::ParticleSystem::drawImplementation(osg::RenderInfo&) const (ReadWriteMutex:89) ==31276== by 0x43E48C3: osgUtil::RenderLeaf::render(osg::RenderInfo&, osgUtil::RenderLeaf*) (Drawable:898) ==31276== by 0x43DF2DD: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:419) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43DF36E: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:469) ==31276== by 0x43E6FF3: osgUtil::RenderStage::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1251) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43E811D: osgUtil::RenderStage::drawInner(osg::RenderInfo&, osgUtil::RenderLeaf*&, bool&) (RenderStage.cpp:845) ==31276== by 0x43EB505: osgUtil::RenderStage::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1108) ==31276== Required order was established by acquisition of lock at 0x58F6A9C ==31276== at 0x4025D47: pthread_mutex_lock (hg_intercepts.c:409) ==31276== by 0x4030D86: OpenThreads::Mutex::lock() (PThreadMutex.c++:122) ==31276== by 0x45C4DFD: OpenThreads::ReadWriteMutex::readLock() (ReadWriteMutex:37) ==31276== by 0x45C2AFA: osgParticle::ParticleSystem::drawImplementation(osg::RenderInfo&) const (ReadWriteMutex:89) ==31276== by 0x43E48C3: osgUtil::RenderLeaf::render(osg::RenderInfo&, osgUtil::RenderLeaf*) (Drawable:898) ==31276== by 0x43DF2DD: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:419) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43DF36E: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:469) ==31276== by 0x43E6FF3: osgUtil::RenderStage::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1251) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43E811D: osgUtil::RenderStage::drawInner(osg::RenderInfo&, osgUtil::RenderLeaf*&, bool&) (RenderStage.cpp:845) ==31276== by 0x43EB505: osgUtil::RenderStage::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1108) ==31276== followed by a later acquisition of lock at 0x58F6AEC ==31276== at 0x4025D47: pthread_mutex_lock (hg_intercepts.c:409) ==31276== by 0x4030D86: OpenThreads::Mutex::lock() (PThreadMutex.c++:122) ==31276== by 0x45C4D4C: OpenThreads::ReadWriteMutex::readUnlock() (ScopedLock:31) ==31276== by 0x45C2BBE: osgParticle::ParticleSystem::drawImplementation(osg::RenderInfo&) const (ReadWriteMutex:90) ==31276== by 0x43E48C3: osgUtil::RenderLeaf::render(osg::RenderInfo&, osgUtil::RenderLeaf*) (Drawable:898) ==31276== by 0x43DF2DD: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:419) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43DF36E: osgUtil::RenderBin::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:469) ==31276== by 0x43E6FF3: osgUtil::RenderStage::drawImplementation(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1251) ==31276== by 0x43DEFFE: osgUtil::RenderBin::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderBin.cpp:384) ==31276== by 0x43E811D: osgUtil::RenderStage::drawInner(osg::RenderInfo&, osgUtil::RenderLeaf*&, bool&) (RenderStage.cpp:845) ==31276== by 0x43EB505: osgUtil::RenderStage::draw(osg::RenderInfo&, osgUtil::RenderLeaf*&) (RenderStage.cpp:1108) pressed as 0, but released as 65307 ==31276== ==31276== ERROR SUMMARY: 512 errors from 2 contexts (suppressed: 0 from 0)
_______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

