Show
Ignore:
Timestamp:
02/26/10 10:23:28 (5 years ago)
Author:
robert
Message:

From Ryan Kawicki, "I guess I missed these during my testing, but if the database pager has outstanding requests while the application is shutting down, the archive can become invalidated through unsafe calls to ReaderWriterTXP::getArchive. I've made this function return a ref_ptr and change other locations to as needed to conform to the change. I've tested this and no more crashes.

Following files from revision 11057 have been attached."

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgPlugins/txp/TXPParser.h

    r5309 r11122  
    8080 
    8181    GeodeGroup() : osg::Group(), _geode(NULL) 
    82         {} 
     82    {} 
    8383     
    8484    GeodeGroup(const GeodeGroup& gg,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY): 
    8585    osg::Group(gg, copyop), _geode(gg._geode) 
    86         {} 
     86    {} 
    8787     
    8888    META_Node(txp, GeodeGroup); 
     
    118118    } 
    119119 
    120         // Gets the archive 
    121         inline TXPArchive* getArchive() 
    122         { 
    123                 return _archive; 
    124         } 
    125      
     120    // Gets the archive 
     121    inline TXPArchive* getArchive() 
     122    { 
     123        return _archive.get(); 
     124    } 
     125 
    126126    // Scene parser 
    127127    osg::Group *parseScene( 
     
    130130        std::map<int,osg::ref_ptr<osg::Node> > &models, 
    131131        double realMinRange, double realMaxRange, double usedMaxRange); 
    132          
     132 
    133133    // Returns the current Top Group 
    134134    inline osg::Group* getCurrTop() 
     
    149149    } 
    150150 
    151         // Ensure material is loaded 
    152         inline void loadMaterial( int ix ) 
    153         { 
    154                 _archive->loadMaterial( ix ); 
    155         } 
     151    // Ensure material is loaded 
     152    inline void loadMaterial( int ix ) 
     153    { 
     154        _archive->loadMaterial( ix ); 
     155    } 
    156156     
    157157    // New to TerraPage 2.0 - local materials 
     
    270270 
    271271    // gets tile center, from the top lod node 
    272         inline const osg::Vec3 getTileCenter() const 
    273         { 
    274                 return _tileCenter; 
    275         } 
    276  
    277         inline void setCurrentNode( osg::Node* node ) 
    278         { 
    279                 _currentNode = node; 
    280         } 
     272    inline const osg::Vec3 getTileCenter() const 
     273    { 
     274        return _tileCenter; 
     275    } 
     276 
     277    inline void setCurrentNode( osg::Node* node ) 
     278    { 
     279        _currentNode = node; 
     280    } 
    281281 
    282282   // After parsing this will return the number of trpgChildRef node found. 
     
    303303     
    304304    // THE archive 
    305     TXPArchive    *_archive; 
     305    osg::ref_ptr< TXPArchive > _archive; 
    306306     
    307307    // Current parent 
     
    324324     
    325325    // Materials 
    326         typedef std::map<int,osg::ref_ptr<osg::StateSet> >* MaterialMapType; 
    327         MaterialMapType _materialMap; 
     326    typedef std::map<int,osg::ref_ptr<osg::StateSet> >* MaterialMapType; 
     327    MaterialMapType _materialMap; 
    328328     
    329329    // Local materials 
     
    331331     
    332332    // Model list 
    333         typedef std::map<int,osg::ref_ptr<osg::Node> > OSGModelsMapType; 
     333    typedef std::map<int,osg::ref_ptr<osg::Node> > OSGModelsMapType; 
    334334    OSGModelsMapType*      _models; 
    335335 
     
    384384 
    385385    geomRead(TXPParser *in_parse) : _parse(in_parse) 
    386         {} 
     386    {} 
    387387    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    388388protected: 
     
    396396public: 
    397397    groupRead(TXPParser *in_parse) : _parse(in_parse) 
    398         {} 
     398    {} 
    399399    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    400400protected: 
     
    407407public: 
    408408    attachRead(TXPParser *in_parse) : _parse(in_parse) 
    409         {} 
     409    {} 
    410410    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    411411protected: 
     
    456456public: 
    457457    lodRead(TXPParser *in_parse) : _parse(in_parse) 
    458         {} 
     458    {} 
    459459    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    460460protected: 
     
    467467public: 
    468468    tileHeaderRead(TXPParser *in_parse) : _parse(in_parse) 
    469         {} 
     469    {} 
    470470    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    471471protected: 
     
    479479public: 
    480480    modelRefRead(TXPParser *in_parse) : _parse(in_parse) 
    481         {} 
     481    {} 
    482482    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    483483protected: 
     
    490490public: 
    491491    billboardRead(TXPParser *in_parse) : _parse(in_parse) 
    492         {} 
     492    {} 
    493493    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    494494protected: 
     
    501501public: 
    502502    lightRead(TXPParser *in_parse) : _parse(in_parse) 
    503         {} 
     503    {} 
    504504    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    505505protected: 
     
    512512public: 
    513513    layerRead(TXPParser *in_parse)  : _parse(in_parse) 
    514         {} 
     514    {} 
    515515    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    516516protected: 
     
    523523public: 
    524524    labelRead(TXPParser *in_parse)  : _parse(in_parse) 
    525         {} 
     525    {} 
    526526    void *Parse(trpgToken tok,trpgReadBuffer &buf); 
    527527protected: