From 750cd78178c450d220732499616e207b20203eaa Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 8 Dec 2014 11:08:48 +0000 Subject: [PATCH] Fixed memory leak in RenderStageCache. git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/branches/OpenSceneGraph-3.2@14579 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 981b67859..f2e2fd8d5 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -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(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)