Fixed memory leak in RenderStageCache.

git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14578 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
Robert Osfield
2014-12-08 11:08:29 +00:00
parent bc424bc54f
commit 35cfbfdb8c

View File

@@ -1364,19 +1364,41 @@ void CullVisitor::apply(osg::ClearNode& node)
namespace osgUtil
{
class RenderStageCache : public osg::Object
class RenderStageCache : public osg::Object, public osg::Observer
{
public:
RenderStageCache() {}
RenderStageCache(const RenderStageCache&, const osg::CopyOp&) {}
virtual ~RenderStageCache()
{
for(RenderStageMap::iterator itr = _renderStageMap.begin();
itr != _renderStageMap.end();
++itr)
{
itr->first->removeObserver(this);
}
}
META_Object(osgUtil, RenderStageCache);
virtual void objectDeleted(void* object)
{
osg::Referenced* ref = reinterpret_cast<osg::Referenced*>(object);
osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(ref);
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
RenderStageMap::iterator itr = _renderStageMap.find(cv);
if (itr!=_renderStageMap.end())
{
_renderStageMap.erase(cv);
}
}
void setRenderStage(CullVisitor* cv, RenderStage* rs)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
_renderStageMap[cv] = rs;
cv->addObserver(this);
}
RenderStage* getRenderStage(osgUtil::CullVisitor* cv)