Show
Ignore:
Timestamp:
01/26/09 16:16:24 (4 years ago)
Author:
robert
Message:

Fixed effective leak in Program::PerContextProgram? caused by previously osg::State keeping a set of std::ref_ptr<Program::PerContextProgram?> without ever pruning this list.
The fix was to convert the osg::State to use C pointers for the set of applied PerContexProgram? objects, and use the osg::Oberver mechanism to avoid dangling pointers for being maintained in osg::State.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/include/osg/State

    r9447 r9549  
    2020#include <osg/Uniform> 
    2121#include <osg/BufferObject> 
     22#include <osg/observer_ptr> 
    2223 
    2324#include <osg/FrameStamp> 
     
    8586  *   \c captureCurrentState() and \c getModelViewMatrix()). 
    8687  */ 
    87 class OSG_EXPORT State : public Referenced 
     88class OSG_EXPORT State : public Referenced, public Observer 
    8889{ 
    8990    public : 
     
    961962 
    962963 
    963         void setLastAppliedProgramObject(const Program::PerContextProgram* program) { if (_lastAppliedProgramObject!=program) { _lastAppliedProgramObject = program; if (program) _appliedProgramObjectSet.insert(program); } } 
    964         const Program::PerContextProgram* getLastAppliedProgramObject() const { return _lastAppliedProgramObject; } 
     964        inline void setLastAppliedProgramObject(const Program::PerContextProgram* program) 
     965        { 
     966            if (_lastAppliedProgramObject!=program) 
     967            { 
     968                _lastAppliedProgramObject = program;  
     969                if (program && _appliedProgramObjectSet.count(program)==0) 
     970                { 
     971                    _appliedProgramObjectSet.insert(program);  
     972                    program->addObserver(this); 
     973                } 
     974            } 
     975        } 
     976        inline const Program::PerContextProgram* getLastAppliedProgramObject() const { return _lastAppliedProgramObject; } 
    965977 
    966978        inline GLint getUniformLocation( const std::string& name ) const { return _lastAppliedProgramObject ? _lastAppliedProgramObject->getUniformLocation(name) : -1; } 
     
    10651077        void initializeExtensionProcs(); 
    10661078 
     1079        virtual void objectDeleted(void* object); 
     1080 
    10671081    protected: 
    10681082 
     
    12071221        typedef std::vector<ref_ptr<const Matrix> >                     MatrixStack; 
    12081222         
    1209         typedef std::set<osg::ref_ptr<const Program::PerContextProgram> > AppliedProgramObjectSet; 
     1223        typedef std::set<const Program::PerContextProgram* >            AppliedProgramObjectSet; 
    12101224 
    12111225        ModeMap                                                         _modeMap;