Index: /OpenSceneGraph/trunk/include/osgDB/DatabasePager
===================================================================
--- /OpenSceneGraph/trunk/include/osgDB/DatabasePager (revision 11143)
+++ /OpenSceneGraph/trunk/include/osgDB/DatabasePager (revision 11285)
@@ -405,5 +405,5 @@
             bool isRequestCurrent (int frameNumber) const
             {
-                return frameNumber - _frameNumberLastRequest <= 1;
+                return _valid && (frameNumber - _frameNumberLastRequest <= 1);
             }
         };
@@ -412,10 +412,24 @@
         {
         public:
-            typedef std::vector< osg::ref_ptr<DatabaseRequest> > RequestList;
-
-            void sort();
-
-            RequestList         _requestList;
-            OpenThreads::Mutex  _requestMutex;
+
+            RequestQueue(DatabasePager* pager);
+
+            void add(DatabaseRequest* databaseRequest);
+
+            void takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest);
+
+            /// prune all the old requests and then return true if requestList left empty
+            bool pruneOldRequestsAndCheckIfEmpty();
+
+            virtual void updateBlock() {}
+
+            void clear();
+
+            typedef std::list< osg::ref_ptr<DatabaseRequest> > RequestList;
+
+            DatabasePager*              _pager;
+            RequestList                 _requestList;
+            OpenThreads::Mutex          _requestMutex;
+            int                         _frameNumberLastPruned;
 
         protected:
@@ -435,21 +449,10 @@
             void release() { _block->release(); }
 
-            void updateBlock()
-            {
-                _block->set((!_requestList.empty() || !_childrenToDeleteList.empty()) &&
-                            !_pager->_databasePagerThreadPaused);
-            }
-
-            void clear();
-
-            void add(DatabaseRequest* databaseRequest);
-
-            void takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest);
+            virtual void updateBlock();
+
 
             osg::ref_ptr<osg::RefBlock> _block;
 
-            DatabasePager*              _pager;
             std::string                 _name;
-            int                         _frameNumberLastPruned;
 
             OpenThreads::Mutex          _childrenToDeleteListMutex;
Index: /OpenSceneGraph/trunk/src/osgDB/DatabasePager.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgDB/DatabasePager.cpp (revision 11236)
+++ /OpenSceneGraph/trunk/src/osgDB/DatabasePager.cpp (revision 11285)
@@ -282,4 +282,21 @@
 //  RequestQueue
 //
+DatabasePager::RequestQueue::RequestQueue(DatabasePager* pager):
+    _pager(pager),
+    _frameNumberLastPruned(-1)
+{
+}
+
+DatabasePager::RequestQueue::~RequestQueue()
+{
+    OSG_INFO<<"DatabasePager::RequestQueue::~RequestQueue() Destructing queue."<<std::endl;
+    for(RequestList::iterator itr = _requestList.begin();
+        itr != _requestList.end();
+        ++itr)
+    {
+        (*itr)->invalidate();
+    }
+}
+
 void DatabasePager::DatabaseRequest::invalidate()
 {
@@ -292,20 +309,115 @@
 }
 
-DatabasePager::RequestQueue::~RequestQueue()
-{
-    OSG_INFO<<"DatabasePager::RequestQueue::~RequestQueue() Destructing queue."<<std::endl;
-    for(RequestList::iterator itr = _requestList.begin();
-        itr != _requestList.end();
-        ++itr)
-    {
-        (*itr)->invalidate();
-    }
-}
-
-void DatabasePager::RequestQueue::sort()
-{
-    std::sort(_requestList.begin(),_requestList.end(),SortFileRequestFunctor());
-}
-
+bool DatabasePager::RequestQueue::pruneOldRequestsAndCheckIfEmpty()
+{
+    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
+
+    if (_frameNumberLastPruned != _pager->_frameNumber)
+    {
+        for(RequestQueue::RequestList::iterator citr = _requestList.begin();
+            citr != _requestList.end();
+            )
+        {
+            if ((*citr)->isRequestCurrent(_pager->_frameNumber))
+            {
+                ++citr;
+            }
+            else
+            {
+                (*citr)->invalidate();
+
+                citr = _requestList.erase(citr);
+                OSG_INFO<<"DatabasePager::RequestQueue::pruneOldRequestsAndCheckIfEmpty(): Pruning "<<(*citr)<<std::endl;
+            }
+        }
+
+        _frameNumberLastPruned = _pager->_frameNumber;
+
+        updateBlock();
+    }
+
+    return _requestList.empty();
+}
+
+
+void DatabasePager::RequestQueue::clear()
+{
+    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
+
+    for(RequestList::iterator citr = _requestList.begin();
+        citr != _requestList.end();
+        ++citr)
+    {
+        (*citr)->invalidate();
+    }
+
+    _requestList.clear();
+
+    _frameNumberLastPruned = _pager->_frameNumber;
+
+    updateBlock();
+}
+
+
+void DatabasePager::RequestQueue::add(DatabasePager::DatabaseRequest* databaseRequest)
+{
+    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
+
+    _requestList.push_back(databaseRequest);
+    databaseRequest->_requestQueue = this;
+
+    updateBlock();
+}
+
+void DatabasePager::RequestQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest)
+{
+    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
+
+    if (!_requestList.empty())
+    {
+        DatabasePager::SortFileRequestFunctor highPriority;
+
+        RequestQueue::RequestList::iterator selected_itr = _requestList.end();
+
+        for(RequestQueue::RequestList::iterator citr = _requestList.begin();
+            citr != _requestList.end();
+            )
+        {
+            if ((*citr)->isRequestCurrent(_pager->_frameNumber))
+            {
+                if (selected_itr==_requestList.end() || highPriority(*citr, *selected_itr))
+                {
+                    selected_itr = citr;
+                }
+
+                ++citr;
+            }
+            else
+            {
+                (*citr)->invalidate();
+
+                citr = _requestList.erase(citr);
+                OSG_INFO<<"DatabasePager::RequestQueue::takeFirst(): Pruning "<<(*citr)<<std::endl;
+            }
+
+        }
+
+        _frameNumberLastPruned = _pager->_frameNumber;
+
+        if (selected_itr != _requestList.end())
+        {
+            databaseRequest = *selected_itr;
+            databaseRequest->_requestQueue = 0;
+            _requestList.erase(selected_itr);
+            OSG_INFO<<" DatabasePager::RequestQueue::takeFirst() Found DatabaseRequest size()="<<_requestList.size()<<std::endl;
+        }
+        else
+        {
+            OSG_INFO<<" DatabasePager::RequestQueue::takeFirst() No suitable DatabaseRequest found size()="<<_requestList.size()<<std::endl;
+        }
+
+        updateBlock();
+    }
+}
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -314,75 +426,14 @@
 //
 DatabasePager::ReadQueue::ReadQueue(DatabasePager* pager, const std::string& name):
-    _pager(pager),
-    _name(name),
-    _frameNumberLastPruned(-1)
+    RequestQueue(pager),
+    _name(name)
 {
     _block = new osg::RefBlock;
 }
 
-void DatabasePager::ReadQueue::clear()
-{
-    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
-
-    for(RequestList::iterator citr = _requestList.begin();
-        citr != _requestList.end();
-        ++citr)
-    {
-        (*citr)->invalidate();
-    }
-
-    _requestList.clear();
-
-    updateBlock();
-}
-
-void DatabasePager::ReadQueue::add(DatabasePager::DatabaseRequest* databaseRequest)
-{
-    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
-    _requestList.push_back(databaseRequest);
-    databaseRequest->_requestQueue = this;
-
-    updateBlock();
-}
-
-void DatabasePager::ReadQueue::takeFirst(osg::ref_ptr<DatabaseRequest>& databaseRequest)
-{
-    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_requestMutex);
-
-    if (!_requestList.empty())
-    {
-        sort();
-
-        if (_frameNumberLastPruned != _pager->_frameNumber)
-        {
-            // Prune all the old entries.
-            RequestQueue::RequestList::iterator tooOld
-                = std::find_if(_requestList.begin(),
-                                _requestList.end(),
-                                refPtrAdapt(std::not1(std::bind2nd(std::mem_fun(&DatabaseRequest::isRequestCurrent),
-                                _pager->_frameNumber))));
-
-            // delete the entries
-            for(RequestQueue::RequestList::iterator citr = tooOld;
-                citr != _requestList.end();
-                ++citr)
-            {
-                (*citr)->invalidate();
-            }
-
-            _requestList.erase(tooOld, _requestList.end());
-
-            _frameNumberLastPruned = _pager->_frameNumber;
-        }
-
-        if (!_requestList.empty())
-        {
-            databaseRequest = _requestList.front();
-            databaseRequest->_requestQueue = 0;
-            _requestList.erase(_requestList.begin());
-        }
-
-        updateBlock();
-    }
+void DatabasePager::ReadQueue::updateBlock()
+{
+    _block->set((!_requestList.empty() || !_childrenToDeleteList.empty()) &&
+                !_pager->_databasePagerThreadPaused);
 }
 
@@ -712,15 +763,11 @@
                 if (loadedObjectsNeedToBeCompiled)
                 {
-                    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToCompileList->_requestMutex);
-                    databaseRequest->_requestQueue = _pager->_dataToCompileList.get();
-                    _pager->_dataToCompileList->_requestList.push_back(databaseRequest);
+                    _pager->_dataToCompileList->add(databaseRequest.get());
                 }
                 else
                 {
-                    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToMergeList->_requestMutex);
-                    databaseRequest->_requestQueue = _pager->_dataToMergeList.get();
-                    _pager->_dataToMergeList->_requestList.push_back(databaseRequest);
+                    _pager->_dataToMergeList->add(databaseRequest.get());
                 }
-            }        
+            }
 
             // Prepare and prune the to-be-compiled list here in
@@ -729,28 +776,5 @@
             if (loadedObjectsNeedToBeCompiled)
             {
-                OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_pager->_dataToCompileList->_requestMutex);
-
-                _pager->_dataToCompileList->sort();
-
-                // Prune all the old entries.
-                RequestQueue::RequestList::iterator tooOld
-                    = std::find_if(_pager->_dataToCompileList->_requestList.begin(),
-                                   _pager->_dataToCompileList->_requestList.end(),
-                                   refPtrAdapt(std::not1(std::bind2nd(std::mem_fun(&DatabaseRequest::isRequestCurrent),
-                                   _pager->_frameNumber))));
-
-                // This is the database thread, so just delete
-                for(RequestQueue::RequestList::iterator citr = tooOld;
-                    citr != _pager->_dataToCompileList->_requestList.end();
-                    ++citr)
-                {
-                    OSG_INFO<<_name<<": pruning from compile list"<<std::endl;
-                    (*citr)->_loadedModel = 0;
-                    (*citr)->_requestQueue = 0;
-                }
-
-                _pager->_dataToCompileList->_requestList.erase(tooOld, _pager->_dataToCompileList->_requestList.end());
-
-                loadedObjectsNeedToBeCompiled = !_pager->_dataToCompileList->_requestList.empty();
+                loadedObjectsNeedToBeCompiled = ! _pager->_dataToCompileList->pruneOldRequestsAndCheckIfEmpty();
             }
 
@@ -972,6 +996,6 @@
     _httpRequestQueue = new ReadQueue(this,"httpRequestQueue");
     
-    _dataToCompileList = new RequestQueue;
-    _dataToMergeList = new RequestQueue;
+    _dataToCompileList = new RequestQueue(this);
+    _dataToMergeList = new RequestQueue(this);
     
     setUpThreads(
@@ -1020,6 +1044,6 @@
     _httpRequestQueue = new ReadQueue(this,"httpRequestQueue");
     
-    _dataToCompileList = new RequestQueue;
-    _dataToMergeList = new RequestQueue;
+    _dataToCompileList = new RequestQueue(this);
+    _dataToMergeList = new RequestQueue(this);
 
     for(DatabaseThreadList::const_iterator dt_itr = rhs._databaseThreads.begin();
@@ -1174,28 +1198,7 @@
     _fileRequestQueue->clear();
     _httpRequestQueue->clear();
-        
-    {
-        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex);
-        for(RequestQueue::RequestList::iterator citr = _dataToCompileList->_requestList.begin();
-            citr != _dataToCompileList->_requestList.end();
-            ++citr)
-        {
-            (*citr)->_loadedModel = 0;
-            (*citr)->_requestQueue = 0;
-        }
-        _dataToCompileList->_requestList.clear();
-    }
-
-    {
-        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex);
-        for(RequestQueue::RequestList::iterator citr = _dataToMergeList->_requestList.begin();
-            citr != _dataToMergeList->_requestList.end();
-            ++citr)
-        {
-            (*citr)->_loadedModel = 0;
-            (*citr)->_requestQueue = 0;
-        }
-        _dataToMergeList->_requestList.clear();
-    }
+
+    _dataToCompileList->clear();
+    _dataToMergeList->clear();
 
     // note, no need to use a mutex as the list is only accessed from the update thread.
@@ -1282,7 +1285,7 @@
     {
         DatabaseRequest* databaseRequest = dynamic_cast<DatabaseRequest*>(databaseRequestRef.get());
-        if (databaseRequest && databaseRequest->valid())
-        {
-            OSG_NOTICE<<"DatabaseRequest has been previously invalidated whilst still attached to scene graph."<<std::endl;
+        if (databaseRequest && !(databaseRequest->valid()))
+        {
+            OSG_INFO<<"DatabaseRequest has been previously invalidated whilst still attached to scene graph."<<std::endl;
             databaseRequest = 0;
         }
@@ -1297,4 +1300,5 @@
                 OpenThreads::ScopedLock<OpenThreads::Mutex> lock(requestQueue->_requestMutex);
 
+                databaseRequest->_valid = true;
                 databaseRequest->_frameNumberLastRequest = frameNumber;
                 databaseRequest->_timestampLastRequest = timestamp;
@@ -1304,4 +1308,5 @@
             else
             {
+                databaseRequest->_valid = true;
                 databaseRequest->_frameNumberLastRequest = frameNumber;
                 databaseRequest->_timestampLastRequest = timestamp;
@@ -1316,4 +1321,5 @@
                 OSG_INFO<<"DatabasePager::requestNodeFile("<<fileName<<") orphaned, resubmitting."<<std::endl;
 
+                databaseRequest->_valid = true;
                 databaseRequest->_frameNumberFirstRequest = frameNumber;
                 databaseRequest->_timestampFirstRequest = timestamp;
@@ -1345,4 +1351,5 @@
             databaseRequestRef = databaseRequest.get();
 
+            databaseRequest->_valid = true;
             databaseRequest->_fileName = fileName;
             databaseRequest->_frameNumberFirstRequest = frameNumber;
@@ -1422,11 +1429,8 @@
 bool DatabasePager::requiresUpdateSceneGraph() const
 {
-    {
-        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex);
-        if (!_dataToMergeList->_requestList.empty()) return true;
-    }
-    
-    return false;
-    
+#if 0
+    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex);
+#endif
+    return !(_dataToMergeList->_requestList.empty());
 }
 
@@ -1458,5 +1462,5 @@
 #ifdef UPDATE_TIMING
     double elapsedTime = timer.elapsedTime_m();
-    if (elapsedTime>0.2)
+    if (elapsedTime>1.0)
     {
         OSG_NOTICE<<"DatabasePager::updateSceneGraph() total time = "<<elapsedTime<<"ms"<<std::endl;
@@ -1835,5 +1839,7 @@
 bool DatabasePager::requiresCompileGLObjects() const
 {
+#if 0
     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex);
+#endif
     return !_dataToCompileList->_requestList.empty();
 }
@@ -1905,12 +1911,5 @@
 
         osg::ref_ptr<DatabaseRequest> databaseRequest;
-
-        // get the first compilable entry.
-        {
-            OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex);
-        
-            // advance to the next entry to compile if one is available.
-            databaseRequest = _dataToCompileList->_requestList.empty() ? 0 : _dataToCompileList->_requestList.front().get();
-        };
+        _dataToCompileList->takeFirst(databaseRequest);
 
         unsigned int numObjectsCompiled = 0;
@@ -1918,5 +1917,5 @@
         // while there are valid databaseRequest's in the to compile list and there is
         // sufficient time left compile each databaseRequest's stateset and drawables.
-        while (databaseRequest.valid() && (compileAll || (elapsedTime<availableTime && numObjectsCompiled<_maximumNumOfObjectsToCompilePerFrame)) ) 
+        while (databaseRequest.valid() && databaseRequest->valid() && (compileAll || (elapsedTime<availableTime && numObjectsCompiled<_maximumNumOfObjectsToCompilePerFrame)) )
         {
             DataToCompileMap& dcm = databaseRequest->_dataToCompileMap;
@@ -2028,38 +2027,15 @@
                 // we've compiled all of the current databaseRequest so we can now pop it off the
                 // to compile list and place it on the merge list.
-                // OSG_NOTICE<<"All compiled"<<std::endl;
-
-
-                OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToCompileList->_requestMutex);
-
-                // The request might have been removed from the
-                // _dataToCompile list by another graphics thread, in
-                // which case it's already on the merge list, or by
-                // the pager, which means that the request has
-                // expired. Also, the compile list might have been
-                // shuffled by the pager, so the current request is
-                // not guaranteed to still be at the beginning of the
-                // list.
-                
-                RequestQueue::RequestList::iterator requestIter
-                    = std::find(_dataToCompileList->_requestList.begin(), _dataToCompileList->_requestList.end(),
-                           databaseRequest);
-                if (requestIter != _dataToCompileList->_requestList.end())
-                {
-                    {
-                        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_dataToMergeList->_requestMutex);
-                        databaseRequest->_requestQueue = _dataToMergeList.get();
-                        _dataToMergeList->_requestList.push_back(databaseRequest);
-                    }
-                    _dataToCompileList->_requestList.erase(requestIter);
-                }
-                
-                if (!_dataToCompileList->_requestList.empty()) databaseRequest = _dataToCompileList->_requestList.front();
-                else databaseRequest = 0;
-
-            }
-            else 
-            {
-                // OSG_NOTICE<<"Not all compiled"<<std::endl;
+                OSG_INFO<<"All compiled"<<std::endl;
+
+                _dataToMergeList->add(databaseRequest.get());
+
+                databaseRequest = 0;
+                _dataToCompileList->takeFirst(databaseRequest);
+            }
+            else
+            {
+                OSG_INFO<<"Not all compiled"<<std::endl;
+                _dataToCompileList->add(databaseRequest.get());
                 databaseRequest = 0;
             }
