Changeset 8434
- Timestamp:
- 06/12/08 18:33:24
- Files:
-
- OpenSceneGraph/trunk/src/osgDB/DatabasePager.cpp (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
OpenSceneGraph/trunk/src/osgDB/DatabasePager.cpp
r8403 r8434 239 239 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 240 240 // 241 // Re questQueue241 // ReadQueue 242 242 // 243 DatabasePager::Re questQueue::RequestQueue(DatabasePager* pager, const std::string& name):243 DatabasePager::ReadQueue::ReadQueue(DatabasePager* pager, const std::string& name): 244 244 _pager(pager), 245 245 _name(name) … … 248 248 } 249 249 250 void DatabasePager::Re questQueue::clear()250 void DatabasePager::ReadQueue::clear() 251 251 { 252 252 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); 253 254 for(RequestList::iterator citr = _requestList.begin(); 255 citr != _requestList.end(); 256 ++citr) 257 { 258 (*citr)->_loadedModel = 0; 259 (*citr)->_requestQueue = 0; 260 } 261 253 262 _requestList.clear(); 254 263 … … 256 265 } 257 266 258 void DatabasePager::Re questQueue::add(DatabasePager::DatabaseRequest* databaseRequest)267 void DatabasePager::ReadQueue::add(DatabasePager::DatabaseRequest* databaseRequest) 259 268 { 260 269 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); 261 270 _requestList.push_back(databaseRequest); 271 databaseRequest->_requestQueue = this; 262 272 263 273 updateBlock(); 264 274 } 265 275 266 void DatabasePager::Re questQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest)276 void DatabasePager::ReadQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest) 267 277 { 268 278 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); … … 272 282 _requestList.sort(SortFileRequestFunctor()); 273 283 databaseRequest = _requestList.front(); 284 databaseRequest->_requestQueue = 0; 274 285 _requestList.erase(_requestList.begin()); 275 286 … … 365 376 bool firstTime = true; 366 377 367 osg::ref_ptr<DatabasePager::Re questQueue> read_queue;368 osg::ref_ptr<DatabasePager::Re questQueue> out_queue;378 osg::ref_ptr<DatabasePager::ReadQueue> read_queue; 379 osg::ref_ptr<DatabasePager::ReadQueue> out_queue; 369 380 370 381 switch(_mode) … … 631 642 if (loadedObjectsNeedToBeCompiled) 632 643 { 633 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToCompileListMutex); 634 _pager->_dataToCompileList.push_back(databaseRequest); 644 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToCompileList->_requestMutex); 645 databaseRequest->_requestQueue = _pager->_dataToCompileList.get(); 646 _pager->_dataToCompileList->_requestList.push_back(databaseRequest); 635 647 } 636 648 else 637 649 { 638 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToMergeListMutex); 639 _pager->_dataToMergeList.push_back(databaseRequest); 650 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToMergeList->_requestMutex); 651 databaseRequest->_requestQueue = _pager->_dataToMergeList.get(); 652 _pager->_dataToMergeList->_requestList.push_back(databaseRequest); 640 653 } 641 654 } … … 646 659 if (loadedObjectsNeedToBeCompiled) 647 660 { 648 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToCompileList Mutex);649 _pager->_dataToCompileList .sort(SortFileRequestFunctor());661 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToCompileList->_requestMutex); 662 _pager->_dataToCompileList->_requestList.sort(SortFileRequestFunctor()); 650 663 651 664 // Prune all the old entries. 652 DatabaseRequestList::iterator tooOld653 = std::find_if(_pager->_dataToCompileList .begin(),654 _pager->_dataToCompileList .end(),665 RequestQueue::RequestList::iterator tooOld 666 = std::find_if(_pager->_dataToCompileList->_requestList.begin(), 667 _pager->_dataToCompileList->_requestList.end(), 655 668 refPtrAdapt(std::not1(std::bind2nd(std::mem_fun(&DatabaseRequest::isRequestCurrent), 656 669 _pager->_frameNumber)))); 657 670 658 671 // This is the database thread, so just delete 659 for( DatabaseRequestList::iterator citr = tooOld;660 citr != _pager->_dataToCompileList .end();672 for(RequestQueue::RequestList::iterator citr = tooOld; 673 citr != _pager->_dataToCompileList->_requestList.end(); 661 674 ++citr) 662 675 { 663 676 osg::notify(osg::INFO)<<_name<<": pruning from compile list"<<std::endl; 664 677 (*citr)->_loadedModel = 0; 678 (*citr)->_requestQueue = 0; 665 679 } 666 680 667 _pager->_dataToCompileList .erase(tooOld, _pager->_dataToCompileList.end());668 669 loadedObjectsNeedToBeCompiled = !_pager->_dataToCompileList .empty();681 _pager->_dataToCompileList->_requestList.erase(tooOld, _pager->_dataToCompileList->_requestList.end()); 682 683 loadedObjectsNeedToBeCompiled = !_pager->_dataToCompileList->_requestList.empty(); 670 684 } 671 685 … … 846 860 //osgDB::Registry::instance()->setUseObjectCacheHint(true); 847 861 848 _fileRequestQueue = new RequestQueue(this,"fileRequestQueue"); 849 _httpRequestQueue = new RequestQueue(this,"httpRequestQueue"); 862 _fileRequestQueue = new ReadQueue(this,"fileRequestQueue"); 863 _httpRequestQueue = new ReadQueue(this,"httpRequestQueue"); 864 865 _dataToCompileList = new RequestQueue; 866 _dataToMergeList = new RequestQueue; 867 850 868 851 869 #if 0 … … 894 912 _maximumNumOfObjectsToCompilePerFrame = rhs._maximumNumOfObjectsToCompilePerFrame; 895 913 896 _fileRequestQueue = new RequestQueue(this,"fileRequestQueue"); 897 _httpRequestQueue = new RequestQueue(this,"httpRequestQueue"); 914 _fileRequestQueue = new ReadQueue(this,"fileRequestQueue"); 915 _httpRequestQueue = new ReadQueue(this,"httpRequestQueue"); 916 917 _dataToCompileList = new RequestQueue; 918 _dataToMergeList = new RequestQueue; 898 919 899 920 for(DatabaseThreadList::const_iterator dt_itr = rhs._databaseThreads.begin(); … … 986 1007 987 1008 { 988 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileListMutex); 989 _dataToCompileList.clear(); 990 } 991 992 { 993 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeListMutex); 994 _dataToMergeList.clear(); 1009 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex); 1010 for(RequestQueue::RequestList::iterator citr = _dataToCompileList->_requestList.begin(); 1011 citr != _dataToCompileList->_requestList.end(); 1012 ++citr) 1013 { 1014 (*citr)->_loadedModel = 0; 1015 (*citr)->_requestQueue = 0; 1016 } 1017 _dataToCompileList->_requestList.clear(); 1018 } 1019 1020 { 1021 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex); 1022 for(RequestQueue::RequestList::iterator citr = _dataToMergeList->_requestList.begin(); 1023 citr != _dataToMergeList->_requestList.end(); 1024 ++citr) 1025 { 1026 (*citr)->_loadedModel = 0; 1027 (*citr)->_requestQueue = 0; 1028 } 1029 _dataToMergeList->_requestList.clear(); 995 1030 } 996 1031 … … 1051 1086 if (databaseRequest) 1052 1087 { 1053 osg::notify(osg::INFO)<<"DatabasePager::fileRquest("<<fileName<<") updating alraedy assigned."<<std::endl; 1054 1055 databaseRequest->_frameNumberLastRequest = frameNumber; 1056 databaseRequest->_timestampLastRequest = timestamp; 1057 databaseRequest->_priorityLastRequest = priority; 1058 ++(databaseRequest->_numOfRequests); 1088 osg::notify(osg::INFO)<<"DatabasePager::fileRequest("<<fileName<<") updating alraedy assigned."<<std::endl; 1089 1090 RequestQueue* requestQueue = databaseRequest->_requestQueue; 1091 if (requestQueue) 1092 { 1093 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(requestQueue->_requestMutex); 1094 1095 databaseRequest->_frameNumberLastRequest = frameNumber; 1096 databaseRequest->_timestampLastRequest = timestamp; 1097 databaseRequest->_priorityLastRequest = priority; 1098 ++(databaseRequest->_numOfRequests); 1099 } 1100 else 1101 { 1102 databaseRequest->_frameNumberLastRequest = frameNumber; 1103 databaseRequest->_timestampLastRequest = timestamp; 1104 databaseRequest->_priorityLastRequest = priority; 1105 ++(databaseRequest->_numOfRequests); 1106 } 1059 1107 1060 1108 foundEntry = true; … … 1072 1120 databaseRequest->_groupForAddingLoadedSubgraph = group; 1073 1121 databaseRequest->_loadOptions = loadOptions; 1122 databaseRequest->_requestQueue = _fileRequestQueue.get(); 1074 1123 1075 1124 _fileRequestQueue->add(databaseRequest); … … 1100 1149 databaseRequest->_groupForAddingLoadedSubgraph = group; 1101 1150 databaseRequest->_loadOptions = loadOptions; 1151 databaseRequest->_requestQueue = _fileRequestQueue.get(); 1102 1152 1103 1153 _fileRequestQueue->_requestList.push_back(databaseRequest.get()); … … 1158 1208 { 1159 1209 { 1160 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList Mutex);1161 if (!_dataToMergeList .empty()) return true;1210 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex); 1211 if (!_dataToMergeList->_requestList.empty()) return true; 1162 1212 } 1163 1213 … … 1172 1222 // osg::Timer_t before = osg::Timer::instance()->tick(); 1173 1223 1174 DatabaseRequestList localFileLoadedList;1224 RequestQueue::RequestList localFileLoadedList; 1175 1225 1176 1226 // get the dat for the _dataToCompileList, leaving it empty via a std::vector<>.swap. 1177 1227 { 1178 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList Mutex);1179 localFileLoadedList.swap(_dataToMergeList );1228 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex); 1229 localFileLoadedList.swap(_dataToMergeList->_requestList); 1180 1230 } 1181 1231 1182 1232 // add the loaded data into the scene graph. 1183 for( DatabaseRequestList::iterator itr=localFileLoadedList.begin();1233 for(RequestQueue::RequestList::iterator itr=localFileLoadedList.begin(); 1184 1234 itr!=localFileLoadedList.end(); 1185 1235 ++itr) … … 1361 1411 bool DatabasePager::requiresCompileGLObjects() const 1362 1412 { 1363 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList Mutex);1364 return !_dataToCompileList .empty();1413 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex); 1414 return !_dataToCompileList->_requestList.empty(); 1365 1415 } 1366 1416 … … 1434 1484 // get the first compilable entry. 1435 1485 { 1436 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList Mutex);1486 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex); 1437 1487 1438 1488 // advance to the next entry to compile if one is available. 1439 databaseRequest = _dataToCompileList .empty() ? 0 : _dataToCompileList.front();1489 databaseRequest = _dataToCompileList->_requestList.empty() ? 0 : _dataToCompileList->_requestList.front(); 1440 1490 }; 1441 1491 … … 1554 1604 1555 1605 1556 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList Mutex);1606 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex); 1557 1607 1558 1608 // The request might have been removed from the … … 1564 1614 // not guaranteed to still be at the beginning of the 1565 1615 // list. 1566 DatabaseRequestList::iterator requestIter 1567 = std::find(_dataToCompileList.begin(), _dataToCompileList.end(), 1616 1617 RequestQueue::RequestList::iterator requestIter 1618 = std::find(_dataToCompileList->_requestList.begin(), _dataToCompileList->_requestList.end(), 1568 1619 databaseRequest); 1569 if (requestIter != _dataToCompileList .end())1620 if (requestIter != _dataToCompileList->_requestList.end()) 1570 1621 { 1571 1622 { 1572 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeListMutex); 1573 _dataToMergeList.push_back(databaseRequest); 1623 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex); 1624 databaseRequest->_requestQueue = _dataToMergeList.get(); 1625 _dataToMergeList->_requestList.push_back(databaseRequest); 1574 1626 } 1575 _dataToCompileList .erase(requestIter);1627 _dataToCompileList->_requestList.erase(requestIter); 1576 1628 } 1577 1629 1578 if (!_dataToCompileList .empty()) databaseRequest = _dataToCompileList.front();1630 if (!_dataToCompileList->_requestList.empty()) databaseRequest = _dataToCompileList->_requestList.front(); 1579 1631 else databaseRequest = 0; 1580 1632
