Show
Ignore:
Timestamp:
03/24/10 15:27:00 (4 years ago)
Author:
robert
Message:

Refactored the way that the RequestQueue?'s are pruned and highest prioty items taken from them so the operation is
now O(n) rather than O(nlogn) where n is the number of requests. The refactoring also cleans up the access of the
request lists so that the code is more readable/maintainable.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/include/osgDB/DatabasePager

    r11143 r11285  
    405405            bool isRequestCurrent (int frameNumber) const 
    406406            { 
    407                 return frameNumber - _frameNumberLastRequest <= 1; 
     407                return _valid && (frameNumber - _frameNumberLastRequest <= 1); 
    408408            } 
    409409        }; 
     
    412412        { 
    413413        public: 
    414             typedef std::vector< osg::ref_ptr<DatabaseRequest> > RequestList; 
    415  
    416             void sort(); 
    417  
    418             RequestList         _requestList; 
    419             OpenThreads::Mutex  _requestMutex; 
     414 
     415            RequestQueue(DatabasePager* pager); 
     416 
     417            void add(DatabaseRequest* databaseRequest); 
     418 
     419            void takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest); 
     420 
     421            /// prune all the old requests and then return true if requestList left empty 
     422            bool pruneOldRequestsAndCheckIfEmpty(); 
     423 
     424            virtual void updateBlock() {} 
     425 
     426            void clear(); 
     427 
     428            typedef std::list< osg::ref_ptr<DatabaseRequest> > RequestList; 
     429 
     430            DatabasePager*              _pager; 
     431            RequestList                 _requestList; 
     432            OpenThreads::Mutex          _requestMutex; 
     433            int                         _frameNumberLastPruned; 
    420434 
    421435        protected: 
     
    435449            void release() { _block->release(); } 
    436450 
    437             void updateBlock() 
    438             { 
    439                 _block->set((!_requestList.empty() || !_childrenToDeleteList.empty()) && 
    440                             !_pager->_databasePagerThreadPaused); 
    441             } 
    442  
    443             void clear(); 
    444  
    445             void add(DatabaseRequest* databaseRequest); 
    446  
    447             void takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest); 
     451            virtual void updateBlock(); 
     452 
    448453 
    449454            osg::ref_ptr<osg::RefBlock> _block; 
    450455 
    451             DatabasePager*              _pager; 
    452456            std::string                 _name; 
    453             int                         _frameNumberLastPruned; 
    454457 
    455458            OpenThreads::Mutex          _childrenToDeleteListMutex;