diff --git a/include/osgDB/DatabasePager b/include/osgDB/DatabasePager index a6e1924c0..1b2b23465 100644 --- a/include/osgDB/DatabasePager +++ b/include/osgDB/DatabasePager @@ -306,13 +306,13 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl virtual void compileAllGLObjects(osg::State& state); /** Report how many items are in the _fileRequestList queue */ - unsigned int getFileRequestListSize() const { return _fileRequestQueue->_requestList.size() + _httpRequestQueue->_requestList.size(); } + unsigned int getFileRequestListSize() const { return _fileRequestQueue->size() + _httpRequestQueue->size(); } /** Report how many items are in the _dataToCompileList queue */ - unsigned int getDataToCompileListSize() const { return _dataToCompileList->_requestList.size(); } + unsigned int getDataToCompileListSize() const { return _dataToCompileList->size(); } /** Report how many items are in the _dataToCompileList queue */ - unsigned int getDataToMergeListSize() const { return _dataToMergeList->_requestList.size(); } + unsigned int getDataToMergeListSize() const { return _dataToMergeList->size(); } /** Report whether any requests are in the pager.*/ bool getRequestsInProgress() const; @@ -407,6 +407,7 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl RequestQueue(DatabasePager* pager); void add(DatabaseRequest* databaseRequest); + void addNoLock(DatabaseRequest* databaseRequest); void takeFirst(osg::ref_ptr& databaseRequest); @@ -415,11 +416,18 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl virtual void updateBlock() {} + bool empty() const { return size()==0; } + + unsigned int size() const { return _size; } + void clear(); + typedef std::list< osg::ref_ptr > RequestList; + void swap(RequestList& requestList); DatabasePager* _pager; + unsigned int _size; RequestList _requestList; OpenThreads::Mutex _requestMutex; int _frameNumberLastPruned; diff --git a/src/osgDB/DatabasePager.cpp b/src/osgDB/DatabasePager.cpp index 0d4158b45..c2591e684 100644 --- a/src/osgDB/DatabasePager.cpp +++ b/src/osgDB/DatabasePager.cpp @@ -460,12 +460,28 @@ struct DatabasePager::SortFileRequestFunctor }; + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// DatabaseRequest +// +void DatabasePager::DatabaseRequest::invalidate() +{ + OSG_INFO<<" DatabasePager::DatabaseRequest::invalidate()."< lock(_requestMutex); @@ -511,9 +517,15 @@ bool DatabasePager::RequestQueue::pruneOldRequestsAndCheckIfEmpty() OSG_INFO<<"DatabasePager::RequestQueue::pruneOldRequestsAndCheckIfEmpty(): Pruning "<<(*citr)<& datab databaseRequest = *selected_itr; databaseRequest->_requestQueue = 0; _requestList.erase(selected_itr); + --_size; OSG_INFO<<" DatabasePager::RequestQueue::takeFirst() Found DatabaseRequest size()="<<_requestList.size()<& datab OSG_INFO<<" DatabasePager::RequestQueue::takeFirst() No suitable DatabaseRequest found size()="<<_requestList.size()<_requestList.size()= "<_requestList.size()<<" to delete = "<_childrenToDeleteList.size()<size()= "<size()<<" to delete = "<_childrenToDeleteList.size()<_loadOptions = loadOptions; databaseRequest->_requestQueue = _fileRequestQueue.get(); - _fileRequestQueue->_requestList.push_back(databaseRequest.get()); - - _fileRequestQueue->updateBlock(); + _fileRequestQueue->addNoLock(databaseRequest.get()); } } @@ -1617,10 +1659,7 @@ void DatabasePager::setDatabasePagerThreadPause(bool pause) bool DatabasePager::requiresUpdateSceneGraph() const { -#if 0 - OpenThreads::ScopedLock lock(_dataToMergeList->_requestMutex); -#endif - return !(_dataToMergeList->_requestList.empty()); + return !(_dataToMergeList->empty()); } #define UPDATE_TIMING 0 @@ -1671,10 +1710,7 @@ void DatabasePager::addLoadedDataToSceneGraph(const osg::FrameStamp &frameStamp) RequestQueue::RequestList localFileLoadedList; // get the data for the _dataToCompileList, leaving it empty via a std::vector<>.swap. - { - OpenThreads::ScopedLock lock(_dataToMergeList->_requestMutex); - localFileLoadedList.swap(_dataToMergeList->_requestList); - } + _dataToMergeList->swap(localFileLoadedList); mid = osg::Timer::instance()->tick(); @@ -1900,10 +1936,7 @@ void DatabasePager::registerPagedLODs(osg::Node* subgraph, int frameNumber) bool DatabasePager::requiresCompileGLObjects() const { -#if 0 - OpenThreads::ScopedLock lock(_dataToCompileList->_requestMutex); -#endif - return !_dataToCompileList->_requestList.empty(); + return !_dataToCompileList->empty(); } void DatabasePager::setCompileGLObjectsForContextID(unsigned int contextID, bool on)