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/src/osg/State.cpp

    r9469 r9549  
    9191State::~State() 
    9292{ 
     93    for(AppliedProgramObjectSet::iterator itr = _appliedProgramObjectSet.begin(); 
     94        itr != _appliedProgramObjectSet.end(); 
     95        ++itr) 
     96    { 
     97        (*itr)->removeObserver(this); 
     98    } 
     99} 
     100 
     101void State::objectDeleted(void* object) 
     102{ 
     103    const Program::PerContextProgram* ppcp = reinterpret_cast<const Program::PerContextProgram*>(object); 
     104    AppliedProgramObjectSet::iterator itr = _appliedProgramObjectSet.find(ppcp); 
     105    if (itr != _appliedProgramObjectSet.end())  
     106    { 
     107        osg::notify(osg::NOTICE)<<"Removing _appliedProgramObjectSet entry "<<ppcp<<std::endl; 
     108        _appliedProgramObjectSet.erase(itr); 
     109    } 
    93110} 
    94111