Fixed memory leak in RenderStageCache.

git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/branches/OpenSceneGraph-3.2@14579 16af8721-9629-0410-8352-f15c8da7e697
This commit is contained in:
Robert Osfield
2014-12-08 11:08:48 +00:00
parent b5179e247f
commit 750cd78178

View File

@@ -1361,19 +1361,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)