From 35cfbfdb8c094be409ba8e2d64f87f9e3b4f79b1 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 8 Dec 2014 11:08:29 +0000 Subject: [PATCH] Fixed memory leak in RenderStageCache. git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14578 16af8721-9629-0410-8352-f15c8da7e697 --- src/osgUtil/CullVisitor.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index 7f36b575f..22d8b992a 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -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(object); + osgUtil::CullVisitor* cv = dynamic_cast(ref); + OpenThreads::ScopedLock lock(_mutex); + RenderStageMap::iterator itr = _renderStageMap.find(cv); + if (itr!=_renderStageMap.end()) + { + _renderStageMap.erase(cv); + } + } + void setRenderStage(CullVisitor* cv, RenderStage* rs) { OpenThreads::ScopedLock lock(_mutex); _renderStageMap[cv] = rs; + cv->addObserver(this); } RenderStage* getRenderStage(osgUtil::CullVisitor* cv)