Added pruning of requests that haven't been reissued since the last frame.

This commit is contained in:
Robert Osfield
2010-02-10 11:21:45 +00:00
parent edd4b2fc84
commit 6ab51c7c47
2 changed files with 44 additions and 19 deletions

View File

@@ -407,28 +407,29 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl
struct ReadQueue : public RequestQueue
{
ReadQueue(DatabasePager* pager, const std::string& name);
void block() { _block->block(); }
void release() { _block->release(); }
void updateBlock()
{
_block->set((!_requestList.empty() || !_childrenToDeleteList.empty()) &&
!_pager->_databasePagerThreadPaused);
_block->set((!_requestList.empty() || !_childrenToDeleteList.empty()) &&
!_pager->_databasePagerThreadPaused);
}
void clear();
void add(DatabaseRequest* databaseRequest);
void takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest);
osg::ref_ptr<osg::RefBlock> _block;
DatabasePager* _pager;
std::string _name;
int _frameNumberLastPruned;
OpenThreads::Mutex _childrenToDeleteListMutex;
ObjectList _childrenToDeleteList;
};

View File

@@ -289,7 +289,6 @@ void DatabasePager::DatabaseRequest::invalidate()
_loadedModel = 0;
_dataToCompileMap.clear();
_requestQueue = 0;
_requestQueue = 0;
}
DatabasePager::RequestQueue::~RequestQueue()
@@ -315,7 +314,8 @@ void DatabasePager::RequestQueue::sort()
//
DatabasePager::ReadQueue::ReadQueue(DatabasePager* pager, const std::string& name):
_pager(pager),
_name(name)
_name(name),
_frameNumberLastPruned(-1)
{
_block = new osg::RefBlock;
}
@@ -328,8 +328,7 @@ void DatabasePager::ReadQueue::clear()
citr != _requestList.end();
++citr)
{
(*citr)->_loadedModel = 0;
(*citr)->_requestQueue = 0;
(*citr)->invalidate();
}
_requestList.clear();
@@ -353,10 +352,35 @@ void DatabasePager::ReadQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& database
if (!_requestList.empty())
{
sort();
databaseRequest = _requestList.front();
databaseRequest->_requestQueue = 0;
_requestList.erase(_requestList.begin());
if (_frameNumberLastPruned != _pager->_frameNumber)
{
// Prune all the old entries.
RequestQueue::RequestList::iterator tooOld
= std::find_if(_requestList.begin(),
_requestList.end(),
refPtrAdapt(std::not1(std::bind2nd(std::mem_fun(&DatabaseRequest::isRequestCurrent),
_pager->_frameNumber))));
// delete the entries
for(RequestQueue::RequestList::iterator citr = tooOld;
citr != _requestList.end();
++citr)
{
(*citr)->invalidate();
}
_requestList.erase(tooOld, _requestList.end());
_frameNumberLastPruned = _pager->_frameNumber;
}
if (!_requestList.empty())
{
databaseRequest = _requestList.front();
databaseRequest->_requestQueue = 0;
_requestList.erase(_requestList.begin());
}
updateBlock();
}