Added size() and swap() methods to provide a thread safe way to keep track of size of a RequestQueue/ReadQueue.

This commit is contained in:
Robert Osfield
2010-06-07 11:28:25 +00:00
parent bcebc9a23f
commit 1d401f2333
2 changed files with 71 additions and 30 deletions

View File

@@ -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>& 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<DatabaseRequest> > RequestList;
void swap(RequestList& requestList);
DatabasePager* _pager;
unsigned int _size;
RequestList _requestList;
OpenThreads::Mutex _requestMutex;
int _frameNumberLastPruned;

View File

@@ -460,12 +460,28 @@ struct DatabasePager::SortFileRequestFunctor
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// DatabaseRequest
//
void DatabasePager::DatabaseRequest::invalidate()
{
OSG_INFO<<" DatabasePager::DatabaseRequest::invalidate()."<<std::endl;
_valid = false;
_groupForAddingLoadedSubgraph = 0;
_loadedModel = 0;
_dataToCompileMap.clear();
_requestQueue = 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// RequestQueue
//
DatabasePager::RequestQueue::RequestQueue(DatabasePager* pager):
_pager(pager),
_size(0),
_frameNumberLastPruned(-1)
{
}
@@ -481,16 +497,6 @@ DatabasePager::RequestQueue::~RequestQueue()
}
}
void DatabasePager::DatabaseRequest::invalidate()
{
OSG_INFO<<" DatabasePager::DatabaseRequest::invalidate()."<<std::endl;
_valid = false;
_groupForAddingLoadedSubgraph = 0;
_loadedModel = 0;
_dataToCompileMap.clear();
_requestQueue = 0;
}
bool DatabasePager::RequestQueue::pruneOldRequestsAndCheckIfEmpty()
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
@@ -511,9 +517,15 @@ bool DatabasePager::RequestQueue::pruneOldRequestsAndCheckIfEmpty()
OSG_INFO<<"DatabasePager::RequestQueue::pruneOldRequestsAndCheckIfEmpty(): Pruning "<<(*citr)<<std::endl;
citr = _requestList.erase(citr);
--_size;
}
}
if (_requestList.size()!=_size)
{
OSG_NOTICE<<"DatabasePager::pruneOldRequestsAndCheckIfEmpty(): Error, _size = "<<_size<<" _requestList.size()="<<_requestList.size()<<std::endl;
}
_frameNumberLastPruned = _pager->_frameNumber;
updateBlock();
@@ -536,6 +548,13 @@ void DatabasePager::RequestQueue::clear()
_requestList.clear();
_size = 0;
if (_requestList.size()!=_size)
{
OSG_NOTICE<<"DatabasePager::clear(): Error, _size = "<<_size<<" _requestList.size()="<<_requestList.size()<<std::endl;
}
_frameNumberLastPruned = _pager->_frameNumber;
updateBlock();
@@ -546,12 +565,30 @@ void DatabasePager::RequestQueue::add(DatabasePager::DatabaseRequest* databaseRe
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
addNoLock(databaseRequest);
}
void DatabasePager::RequestQueue::addNoLock(DatabasePager::DatabaseRequest* databaseRequest)
{
_requestList.push_back(databaseRequest);
++_size;
databaseRequest->_requestQueue = this;
if (_requestList.size()!=_size)
{
OSG_NOTICE<<"DatabasePager::add(): Error, _size = "<<_size<<" _requestList.size()="<<_requestList.size()<<std::endl;
}
updateBlock();
}
void DatabasePager::RequestQueue::swap(RequestList& requestList)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
_requestList.swap(requestList);
_size = _requestList.size();
}
void DatabasePager::RequestQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest)
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
@@ -581,6 +618,7 @@ void DatabasePager::RequestQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& datab
OSG_INFO<<"DatabasePager::RequestQueue::takeFirst(): Pruning "<<(*citr)<<std::endl;
citr = _requestList.erase(citr);
--_size;
}
}
@@ -592,6 +630,7 @@ void DatabasePager::RequestQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& datab
databaseRequest = *selected_itr;
databaseRequest->_requestQueue = 0;
_requestList.erase(selected_itr);
--_size;
OSG_INFO<<" DatabasePager::RequestQueue::takeFirst() Found DatabaseRequest size()="<<_requestList.size()<<std::endl;
}
else
@@ -599,6 +638,11 @@ void DatabasePager::RequestQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& datab
OSG_INFO<<" DatabasePager::RequestQueue::takeFirst() No suitable DatabaseRequest found size()="<<_requestList.size()<<std::endl;
}
if (_requestList.size()!=_size)
{
OSG_NOTICE<<"DatabasePager::takeFirst(): Error, _size = "<<_size<<" _requestList.size()="<<_requestList.size()<<std::endl;
}
updateBlock();
}
}
@@ -616,7 +660,7 @@ DatabasePager::ReadQueue::ReadQueue(DatabasePager* pager, const std::string& nam
void DatabasePager::ReadQueue::updateBlock()
{
_block->set((!_requestList.empty() || !_childrenToDeleteList.empty()) &&
_block->set((!empty() || !_childrenToDeleteList.empty()) &&
!_pager->_databasePagerThreadPaused);
}
@@ -735,7 +779,7 @@ void DatabasePager::DatabaseThread::run()
_active = true;
OSG_INFO<<_name<<": _pager->_requestList.size()= "<<read_queue->_requestList.size()<<" to delete = "<<read_queue->_childrenToDeleteList.size()<<std::endl;
OSG_INFO<<_name<<": _pager->size()= "<<read_queue->size()<<" to delete = "<<read_queue->_childrenToDeleteList.size()<<std::endl;
//
@@ -1552,9 +1596,7 @@ void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* grou
databaseRequest->_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<OpenThreads::Mutex> 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<OpenThreads::Mutex> 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<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex);
#endif
return !_dataToCompileList->_requestList.empty();
return !_dataToCompileList->empty();
}
void DatabasePager::setCompileGLObjectsForContextID(unsigned int contextID, bool on)