From 6a16cbfca4c92060e2384661ea16a7816cf7b855 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 22 May 2008 12:38:36 +0000 Subject: [PATCH] Reorginaized the DatabaseQueue's to avoid warnings under Windows --- include/osgDB/DatabasePager | 6 ++-- src/osgDB/DatabasePager.cpp | 65 +++++++++++++++++++++++-------------- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/include/osgDB/DatabasePager b/include/osgDB/DatabasePager index 723871698..fa23887af 100644 --- a/include/osgDB/DatabasePager +++ b/include/osgDB/DatabasePager @@ -275,7 +275,7 @@ 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->_requestList.size() + _httpRequestQueue->_requestList.size(); } /** Report how many items are in the _dataToCompileList queue */ unsigned int getDataToCompileListSize() const { return _dataToCompileList.size(); } @@ -492,8 +492,8 @@ class OSGDB_EXPORT DatabasePager : public osg::NodeVisitor::DatabaseRequestHandl mutable OpenThreads::Mutex _numFramesActiveMutex; int _frameNumber; - RequestQueue _fileRequestQueue; - RequestQueue _httpRequestQueue; + osg::ref_ptr _fileRequestQueue; + osg::ref_ptr _httpRequestQueue; //DatabaseRequestList _fileRequestList; //mutable OpenThreads::Mutex _fileRequestListMutex; diff --git a/src/osgDB/DatabasePager.cpp b/src/osgDB/DatabasePager.cpp index fb59e2237..7779fa51e 100644 --- a/src/osgDB/DatabasePager.cpp +++ b/src/osgDB/DatabasePager.cpp @@ -309,6 +309,19 @@ int DatabasePager::DatabaseThread::cancel() { _done = true; + + switch(_mode) + { + case(HANDLE_ALL_REQUESTS): + _pager->_fileRequestQueue->release(); + break; + case(HANDLE_NON_HTTP): + _pager->_fileRequestQueue->release(); + break; + case(HANDLE_ONLY_HTTP): + _pager->_httpRequestQueue->release(); + break; + } // release the frameBlock and _databasePagerThreadBlock in case its holding up thread cancellation. // _databasePagerThreadBlock->release(); @@ -349,20 +362,20 @@ void DatabasePager::DatabaseThread::run() bool firstTime = true; - DatabasePager::RequestQueue* read_queue; - DatabasePager::RequestQueue* out_queue; + osg::ref_ptr read_queue; + osg::ref_ptr out_queue; switch(_mode) { case(HANDLE_ALL_REQUESTS): - read_queue = &(_pager->_fileRequestQueue); + read_queue = _pager->_fileRequestQueue; break; case(HANDLE_NON_HTTP): - read_queue = &(_pager->_fileRequestQueue); - out_queue = &(_pager->_httpRequestQueue); + read_queue = _pager->_fileRequestQueue; + out_queue = _pager->_httpRequestQueue; break; case(HANDLE_ONLY_HTTP): - read_queue = &(_pager->_httpRequestQueue); + read_queue = _pager->_httpRequestQueue; break; } @@ -695,9 +708,7 @@ void DatabasePager::DatabaseThread::run() // // DatabasePager // -DatabasePager::DatabasePager(): - _fileRequestQueue(this,"fileRequestQueue"), - _httpRequestQueue(this,"httpRequestQueue") +DatabasePager::DatabasePager() { //osg::notify(osg::INFO)<<"Constructing DatabasePager()"<getSharedStateManager()) //osgDB::Registry::instance()->setUseObjectCacheHint(true); + _fileRequestQueue = new RequestQueue(this,"fileRequestQueue"); + _httpRequestQueue = new RequestQueue(this,"httpRequestQueue"); + #if 0 _databaseThreads.push_back(new DatabaseThread(this, DatabaseThread::HANDLE_ALL_REQUESTS,"HANDLE_ALL_REQUESTS")); #else @@ -838,9 +852,7 @@ DatabasePager::DatabasePager(): #endif } -DatabasePager::DatabasePager(const DatabasePager& rhs): - _fileRequestQueue(this,"fileRequestQueue"), - _httpRequestQueue(this,"httpRequestQueue") +DatabasePager::DatabasePager(const DatabasePager& rhs) { //osg::notify(osg::INFO)<<"Constructing DatabasePager(const DatabasePager& )"<release(); + _httpRequestQueue->release(); for(DatabaseThreadList::iterator dt_itr = _databaseThreads.begin(); dt_itr != _databaseThreads.end(); @@ -954,8 +969,8 @@ int DatabasePager::cancel() void DatabasePager::clear() { - _fileRequestQueue.clear(); - _httpRequestQueue.clear(); + _fileRequestQueue->clear(); + _httpRequestQueue->clear(); { OpenThreads::ScopedLock lock(_dataToCompileListMutex); @@ -1045,7 +1060,7 @@ void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* grou databaseRequest->_groupForAddingLoadedSubgraph = group; databaseRequest->_loadOptions = loadOptions; - _fileRequestQueue.add(databaseRequest); + _fileRequestQueue->add(databaseRequest); } } @@ -1055,7 +1070,7 @@ void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* grou { osg::notify(osg::INFO)<<"In DatabasePager::fileRquest("< lock(_fileRequestQueue._requestMutex); + OpenThreads::ScopedLock lock(_fileRequestQueue->_requestMutex); if (!databaseRequestRef.valid() || databaseRequestRef->referenceCount()==1) { @@ -1073,9 +1088,9 @@ void DatabasePager::requestNodeFile(const std::string& fileName,osg::Group* grou databaseRequest->_groupForAddingLoadedSubgraph = group; databaseRequest->_loadOptions = loadOptions; - _fileRequestQueue._requestList.push_back(databaseRequest.get()); + _fileRequestQueue->_requestList.push_back(databaseRequest.get()); - _fileRequestQueue.updateBlock(); + _fileRequestQueue->updateBlock(); } } @@ -1122,8 +1137,8 @@ void DatabasePager::setDatabasePagerThreadPause(bool pause) if (_databasePagerThreadPaused == pause) return; _databasePagerThreadPaused = pause; - _fileRequestQueue.updateBlock(); - _httpRequestQueue.updateBlock(); + _fileRequestQueue->updateBlock(); + _httpRequestQueue->updateBlock(); } @@ -1256,15 +1271,15 @@ void DatabasePager::removeExpiredSubgraphs(double currentFrameTime) // pass the objects across to the database pager delete list if (_deleteRemovedSubgraphsInDatabaseThread) { - OpenThreads::ScopedLock lock(_fileRequestQueue._childrenToDeleteListMutex); + OpenThreads::ScopedLock lock(_fileRequestQueue->_childrenToDeleteListMutex); for (osg::NodeList::iterator critr = childrenRemoved.begin(); critr!=childrenRemoved.end(); ++critr) { - _fileRequestQueue._childrenToDeleteList.push_back(critr->get()); + _fileRequestQueue->_childrenToDeleteList.push_back(critr->get()); } - _fileRequestQueue.updateBlock(); + _fileRequestQueue->updateBlock(); } // osg::notify(osg::NOTICE)<<" time 2 "<delta_m(before,osg::Timer::instance()->tick())<<" ms "<