Fixes to the database paging.

This commit is contained in:
Robert Osfield
2003-08-19 19:46:18 +00:00
parent e2a72f7e72
commit 5b7d480c0a
2 changed files with 38 additions and 18 deletions

View File

@@ -148,14 +148,19 @@ bool OSGPageManager::StartThread(ThreadMode mode,ThreadID &newThread)
bool OSGPageManager::EndThread()
{
// locationChangeEvent.release();
pagingThread.cancel();
if( pagingThread.isRunning() )
{
pagingThread.cancel();
pagingThread.join();
}
return true;
}
void OSGPageManager::LoadOneTile(trpgManagedTile* tile)
{
osg::Group* tileGroup;
osg::Group* parentNode ;
osg::Group* tileGroup = 0;
osg::Group* parentNode = 0;
int x,y,lod;
tile->GetTileLoc(x,y,lod);
@@ -170,10 +175,13 @@ void OSGPageManager::LoadOneTile(trpgManagedTile* tile)
// we only put tiles with NULL parent to merge list
// others are referenced when added as a child
osgGuard g(changeListMutex);
if(parentNode)
parentNode->addChild(tileGroup) ;
else
toMerge.push_back( tileGroup) ;
// if(parentNode)
// parentNode->addChild(tileGroup) ;
// else
if(parentNode)
toMerge.push_back(MergePair(parentNode,tileGroup)) ;
else
toMerge.push_back(MergePair(0,tileGroup)) ;
//toMergeParent.push_back(parentNode );
}
else
@@ -265,7 +273,10 @@ bool OSGPageManager::ThreadLoop(PagingThread* t)
for (unsigned int gi=0;gi<nextDelete.size();gi++)
{
if( nextDelete[gi] )
{
std::cout<<"unrefing "<<nextDelete[gi]<<std::endl;
nextDelete[gi]->unref();
}
}
#endif
@@ -280,6 +291,9 @@ bool OSGPageManager::ThreadLoop(PagingThread* t)
LoadOneTile(tile);
// Now add this tile to the merge list
pageManage->AckLoad();
//OpenThreads::Thread::Yield();
}
@@ -321,7 +335,7 @@ void OSGPageManager::UpdatePositionThread(double inLocX,double inLocY)
*/
bool OSGPageManager::MergeUpdateThread(osg::Group *rootNode)
{
std::vector<osg::Group *> mergeList;
std::vector<MergePair> mergeList;
std::vector<osg::Group *> unhookList;
// Make local copies of the merge and unhook lists
@@ -345,19 +359,22 @@ bool OSGPageManager::MergeUpdateThread(osg::Group *rootNode)
{
osg::Group *unhookMe = unhookList[ui];
// better safe than sorry
if(!unhookMe ) continue;
// relase textre objects and display lists in subgraph.
unhookMe->accept(rtadv);
// better safe than sorry
if(!unhookMe ) continue;
// Look for its parent(s)
// Only expecting one, but it doesn't matter
const osg::Node::ParentList &parents = unhookMe->getParents();
for (unsigned int pi=0;pi<parents.size();pi++) {
osg::Group *parent = parents[pi];
if(parent != rootNode)
{
//std::cout<<"removing "<<unhookMe<<" from "<<parent<<std::endl;
parent->removeChild(unhookMe);
}
}
}
@@ -372,14 +389,16 @@ bool OSGPageManager::MergeUpdateThread(osg::Group *rootNode)
// Do the merging last
{
for (unsigned int mi=0;mi<mergeList.size();mi++) {
osg::Group *mergeMe = mergeList[mi];
for (unsigned int mi=0;mi<mergeList.size();mi++)
{
osg::Group *parent = mergeList[mi].first.get();
osg::Group *mergeMe = mergeList[mi].second.get();
// NO need for that - we only put tiles with NULL parent to merge list
// osg::Group *parent = mergeParentList[mi];
// if (parent)
// parent->addChild(mergeMe);
// else
rootNode->addChild(mergeMe);
if (parent)
parent->addChild(mergeMe);
else
rootNode->addChild(mergeMe);
}
}

View File

@@ -154,7 +154,8 @@ namespace txp
// Lock for the change lists (merge, unhook, delete)
ThreadMutex changeListMutex;
// Merge list is filled in by the paging thread.
std::vector<osg::Group *> toMerge;
typedef std::pair< osg::ref_ptr<osg::Group> , osg::ref_ptr<osg::Group> > MergePair;
std::vector< MergePair > toMerge;
// no need for that
// std::vector<osg::Group *> toMergeParent;
// Unhook list is filled in by the paging thread