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:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user