From b5d4d9954a037d7c264f3a78af6fd480e8fbe5c0 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 21 Dec 2010 12:54:06 +0000 Subject: [PATCH] From Tim Moore, Dereference the databaseRequest while the queue is locked. This prevents the request from being deleted at an unpredictable time within addLoadedDataToSceneGraph. --- src/osgDB/DatabasePager.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/osgDB/DatabasePager.cpp b/src/osgDB/DatabasePager.cpp index 98947684c..7eb5f4245 100644 --- a/src/osgDB/DatabasePager.cpp +++ b/src/osgDB/DatabasePager.cpp @@ -958,17 +958,24 @@ void DatabasePager::DatabaseThread::run() databaseRequest->_loadedModel = loadedModel; databaseRequest->_compileSet = compileSet; } + // Dereference the databaseRequest while the queue is + // locked. This prevents the request from being + // deleted at an unpredictable time within + // addLoadedDataToSceneGraph. if (loadedObjectsNeedToBeCompiled) { _pager->_incrementalCompileOperation->add(compileSet); - - databaseRequest->_compileSet = compileSet; - - _pager->_dataToCompileList->add(databaseRequest.get()); + OpenThreads::ScopedLock listLock( + _pager->_dataToCompileList->_requestMutex); + _pager->_dataToCompileList->addNoLock(databaseRequest.get()); + databaseRequest = 0; } else { - _pager->_dataToMergeList->add(databaseRequest.get()); + OpenThreads::ScopedLock listLock( + _pager->_dataToMergeList->_requestMutex); + _pager->_dataToMergeList->addNoLock(databaseRequest.get()); + databaseRequest = 0; } }