| 294 | | DatabasePager::RequestQueue::~RequestQueue() |
| 295 | | { |
| 296 | | OSG_INFO<<"DatabasePager::RequestQueue::~RequestQueue() Destructing queue."<<std::endl; |
| 297 | | for(RequestList::iterator itr = _requestList.begin(); |
| 298 | | itr != _requestList.end(); |
| 299 | | ++itr) |
| 300 | | { |
| 301 | | (*itr)->invalidate(); |
| 302 | | } |
| 303 | | } |
| 304 | | |
| 305 | | void DatabasePager::RequestQueue::sort() |
| 306 | | { |
| 307 | | std::sort(_requestList.begin(),_requestList.end(),SortFileRequestFunctor()); |
| 308 | | } |
| 309 | | |
| | 311 | bool DatabasePager::RequestQueue::pruneOldRequestsAndCheckIfEmpty() |
| | 312 | { |
| | 313 | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); |
| | 314 | |
| | 315 | if (_frameNumberLastPruned != _pager->_frameNumber) |
| | 316 | { |
| | 317 | for(RequestQueue::RequestList::iterator citr = _requestList.begin(); |
| | 318 | citr != _requestList.end(); |
| | 319 | ) |
| | 320 | { |
| | 321 | if ((*citr)->isRequestCurrent(_pager->_frameNumber)) |
| | 322 | { |
| | 323 | ++citr; |
| | 324 | } |
| | 325 | else |
| | 326 | { |
| | 327 | (*citr)->invalidate(); |
| | 328 | |
| | 329 | citr = _requestList.erase(citr); |
| | 330 | OSG_INFO<<"DatabasePager::RequestQueue::pruneOldRequestsAndCheckIfEmpty(): Pruning "<<(*citr)<<std::endl; |
| | 331 | } |
| | 332 | } |
| | 333 | |
| | 334 | _frameNumberLastPruned = _pager->_frameNumber; |
| | 335 | |
| | 336 | updateBlock(); |
| | 337 | } |
| | 338 | |
| | 339 | return _requestList.empty(); |
| | 340 | } |
| | 341 | |
| | 342 | |
| | 343 | void DatabasePager::RequestQueue::clear() |
| | 344 | { |
| | 345 | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); |
| | 346 | |
| | 347 | for(RequestList::iterator citr = _requestList.begin(); |
| | 348 | citr != _requestList.end(); |
| | 349 | ++citr) |
| | 350 | { |
| | 351 | (*citr)->invalidate(); |
| | 352 | } |
| | 353 | |
| | 354 | _requestList.clear(); |
| | 355 | |
| | 356 | _frameNumberLastPruned = _pager->_frameNumber; |
| | 357 | |
| | 358 | updateBlock(); |
| | 359 | } |
| | 360 | |
| | 361 | |
| | 362 | void DatabasePager::RequestQueue::add(DatabasePager::DatabaseRequest* databaseRequest) |
| | 363 | { |
| | 364 | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); |
| | 365 | |
| | 366 | _requestList.push_back(databaseRequest); |
| | 367 | databaseRequest->_requestQueue = this; |
| | 368 | |
| | 369 | updateBlock(); |
| | 370 | } |
| | 371 | |
| | 372 | void DatabasePager::RequestQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest) |
| | 373 | { |
| | 374 | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); |
| | 375 | |
| | 376 | if (!_requestList.empty()) |
| | 377 | { |
| | 378 | DatabasePager::SortFileRequestFunctor highPriority; |
| | 379 | |
| | 380 | RequestQueue::RequestList::iterator selected_itr = _requestList.end(); |
| | 381 | |
| | 382 | for(RequestQueue::RequestList::iterator citr = _requestList.begin(); |
| | 383 | citr != _requestList.end(); |
| | 384 | ) |
| | 385 | { |
| | 386 | if ((*citr)->isRequestCurrent(_pager->_frameNumber)) |
| | 387 | { |
| | 388 | if (selected_itr==_requestList.end() || highPriority(*citr, *selected_itr)) |
| | 389 | { |
| | 390 | selected_itr = citr; |
| | 391 | } |
| | 392 | |
| | 393 | ++citr; |
| | 394 | } |
| | 395 | else |
| | 396 | { |
| | 397 | (*citr)->invalidate(); |
| | 398 | |
| | 399 | citr = _requestList.erase(citr); |
| | 400 | OSG_INFO<<"DatabasePager::RequestQueue::takeFirst(): Pruning "<<(*citr)<<std::endl; |
| | 401 | } |
| | 402 | |
| | 403 | } |
| | 404 | |
| | 405 | _frameNumberLastPruned = _pager->_frameNumber; |
| | 406 | |
| | 407 | if (selected_itr != _requestList.end()) |
| | 408 | { |
| | 409 | databaseRequest = *selected_itr; |
| | 410 | databaseRequest->_requestQueue = 0; |
| | 411 | _requestList.erase(selected_itr); |
| | 412 | OSG_INFO<<" DatabasePager::RequestQueue::takeFirst() Found DatabaseRequest size()="<<_requestList.size()<<std::endl; |
| | 413 | } |
| | 414 | else |
| | 415 | { |
| | 416 | OSG_INFO<<" DatabasePager::RequestQueue::takeFirst() No suitable DatabaseRequest found size()="<<_requestList.size()<<std::endl; |
| | 417 | } |
| | 418 | |
| | 419 | updateBlock(); |
| | 420 | } |
| | 421 | } |
| 323 | | void DatabasePager::ReadQueue::clear() |
| 324 | | { |
| 325 | | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); |
| 326 | | |
| 327 | | for(RequestList::iterator citr = _requestList.begin(); |
| 328 | | citr != _requestList.end(); |
| 329 | | ++citr) |
| 330 | | { |
| 331 | | (*citr)->invalidate(); |
| 332 | | } |
| 333 | | |
| 334 | | _requestList.clear(); |
| 335 | | |
| 336 | | updateBlock(); |
| 337 | | } |
| 338 | | |
| 339 | | void DatabasePager::ReadQueue::add(DatabasePager::DatabaseRequest* databaseRequest) |
| 340 | | { |
| 341 | | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); |
| 342 | | _requestList.push_back(databaseRequest); |
| 343 | | databaseRequest->_requestQueue = this; |
| 344 | | |
| 345 | | updateBlock(); |
| 346 | | } |
| 347 | | |
| 348 | | void DatabasePager::ReadQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest) |
| 349 | | { |
| 350 | | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex); |
| 351 | | |
| 352 | | if (!_requestList.empty()) |
| 353 | | { |
| 354 | | sort(); |
| 355 | | |
| 356 | | if (_frameNumberLastPruned != _pager->_frameNumber) |
| 357 | | { |
| 358 | | // Prune all the old entries. |
| 359 | | RequestQueue::RequestList::iterator tooOld |
| 360 | | = std::find_if(_requestList.begin(), |
| 361 | | _requestList.end(), |
| 362 | | refPtrAdapt(std::not1(std::bind2nd(std::mem_fun(&DatabaseRequest::isRequestCurrent), |
| 363 | | _pager->_frameNumber)))); |
| 364 | | |
| 365 | | // delete the entries |
| 366 | | for(RequestQueue::RequestList::iterator citr = tooOld; |
| 367 | | citr != _requestList.end(); |
| 368 | | ++citr) |
| 369 | | { |
| 370 | | (*citr)->invalidate(); |
| 371 | | } |
| 372 | | |
| 373 | | _requestList.erase(tooOld, _requestList.end()); |
| 374 | | |
| 375 | | _frameNumberLastPruned = _pager->_frameNumber; |
| 376 | | } |
| 377 | | |
| 378 | | if (!_requestList.empty()) |
| 379 | | { |
| 380 | | databaseRequest = _requestList.front(); |
| 381 | | databaseRequest->_requestQueue = 0; |
| 382 | | _requestList.erase(_requestList.begin()); |
| 383 | | } |
| 384 | | |
| 385 | | updateBlock(); |
| 386 | | } |
| | 434 | void DatabasePager::ReadQueue::updateBlock() |
| | 435 | { |
| | 436 | _block->set((!_requestList.empty() || !_childrenToDeleteList.empty()) && |
| | 437 | !_pager->_databasePagerThreadPaused); |
| 731 | | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToCompileList->_requestMutex); |
| 732 | | |
| 733 | | _pager->_dataToCompileList->sort(); |
| 734 | | |
| 735 | | // Prune all the old entries. |
| 736 | | RequestQueue::RequestList::iterator tooOld |
| 737 | | = std::find_if(_pager->_dataToCompileList->_requestList.begin(), |
| 738 | | _pager->_dataToCompileList->_requestList.end(), |
| 739 | | refPtrAdapt(std::not1(std::bind2nd(std::mem_fun(&DatabaseRequest::isRequestCurrent), |
| 740 | | _pager->_frameNumber)))); |
| 741 | | |
| 742 | | // This is the database thread, so just delete |
| 743 | | for(RequestQueue::RequestList::iterator citr = tooOld; |
| 744 | | citr != _pager->_dataToCompileList->_requestList.end(); |
| 745 | | ++citr) |
| 746 | | { |
| 747 | | OSG_INFO<<_name<<": pruning from compile list"<<std::endl; |
| 748 | | (*citr)->_loadedModel = 0; |
| 749 | | (*citr)->_requestQueue = 0; |
| 750 | | } |
| 751 | | |
| 752 | | _pager->_dataToCompileList->_requestList.erase(tooOld, _pager->_dataToCompileList->_requestList.end()); |
| 753 | | |
| 754 | | loadedObjectsNeedToBeCompiled = !_pager->_dataToCompileList->_requestList.empty(); |
| | 778 | loadedObjectsNeedToBeCompiled = ! _pager->_dataToCompileList->pruneOldRequestsAndCheckIfEmpty(); |
| 1176 | | |
| 1177 | | { |
| 1178 | | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex); |
| 1179 | | for(RequestQueue::RequestList::iterator citr = _dataToCompileList->_requestList.begin(); |
| 1180 | | citr != _dataToCompileList->_requestList.end(); |
| 1181 | | ++citr) |
| 1182 | | { |
| 1183 | | (*citr)->_loadedModel = 0; |
| 1184 | | (*citr)->_requestQueue = 0; |
| 1185 | | } |
| 1186 | | _dataToCompileList->_requestList.clear(); |
| 1187 | | } |
| 1188 | | |
| 1189 | | { |
| 1190 | | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex); |
| 1191 | | for(RequestQueue::RequestList::iterator citr = _dataToMergeList->_requestList.begin(); |
| 1192 | | citr != _dataToMergeList->_requestList.end(); |
| 1193 | | ++citr) |
| 1194 | | { |
| 1195 | | (*citr)->_loadedModel = 0; |
| 1196 | | (*citr)->_requestQueue = 0; |
| 1197 | | } |
| 1198 | | _dataToMergeList->_requestList.clear(); |
| 1199 | | } |
| | 1200 | |
| | 1201 | _dataToCompileList->clear(); |
| | 1202 | _dataToMergeList->clear(); |
| 2030 | | // OSG_NOTICE<<"All compiled"<<std::endl; |
| 2031 | | |
| 2032 | | |
| 2033 | | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex); |
| 2034 | | |
| 2035 | | // The request might have been removed from the |
| 2036 | | // _dataToCompile list by another graphics thread, in |
| 2037 | | // which case it's already on the merge list, or by |
| 2038 | | // the pager, which means that the request has |
| 2039 | | // expired. Also, the compile list might have been |
| 2040 | | // shuffled by the pager, so the current request is |
| 2041 | | // not guaranteed to still be at the beginning of the |
| 2042 | | // list. |
| 2043 | | |
| 2044 | | RequestQueue::RequestList::iterator requestIter |
| 2045 | | = std::find(_dataToCompileList->_requestList.begin(), _dataToCompileList->_requestList.end(), |
| 2046 | | databaseRequest); |
| 2047 | | if (requestIter != _dataToCompileList->_requestList.end()) |
| 2048 | | { |
| 2049 | | { |
| 2050 | | OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex); |
| 2051 | | databaseRequest->_requestQueue = _dataToMergeList.get(); |
| 2052 | | _dataToMergeList->_requestList.push_back(databaseRequest); |
| 2053 | | } |
| 2054 | | _dataToCompileList->_requestList.erase(requestIter); |
| 2055 | | } |
| 2056 | | |
| 2057 | | if (!_dataToCompileList->_requestList.empty()) databaseRequest = _dataToCompileList->_requestList.front(); |
| 2058 | | else databaseRequest = 0; |
| 2059 | | |
| 2060 | | } |
| 2061 | | else |
| 2062 | | { |
| 2063 | | // OSG_NOTICE<<"Not all compiled"<<std::endl; |
| | 2029 | OSG_INFO<<"All compiled"<<std::endl; |
| | 2030 | |
| | 2031 | _dataToMergeList->add(databaseRequest.get()); |
| | 2032 | |
| | 2033 | databaseRequest = 0; |
| | 2034 | _dataToCompileList->takeFirst(databaseRequest); |
| | 2035 | } |
| | 2036 | else |
| | 2037 | { |
| | 2038 | OSG_INFO<<"Not all compiled"<<std::endl; |
| | 2039 | _dataToCompileList->add(databaseRequest.get()); |