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

Reply via email to