Added clean up class to help improve the exit of GraphicsThread

This commit is contained in:
Robert Osfield 2005-09-02 13:10:46 +00:00
parent 21cabaf5f6
commit 4167a3f980
3 changed files with 59 additions and 18 deletions

View File

@ -309,7 +309,7 @@ int main( int argc, char **argv )
osg::Timer_t previous_tick = start_tick;
bool done = false;
unsigned int maxNumFrames = 500;
unsigned int maxNumFrames = 50;
// main loop - update scene graph, dispatch frame, wait for frame done.
while( !done && frameNum<maxNumFrames)

View File

@ -19,17 +19,40 @@
using namespace osg;
using namespace OpenThreads;
struct MyTest
struct ThreadExitTidyUp
{
MyTest()
ThreadExitTidyUp(osg::GraphicsContext* context, bool closeContextOnExit):
_context(context),
_closeContextOnExit(closeContextOnExit)
{
osg::notify(osg::NOTICE)<<"MyTest Constructor"<<std::endl;
osg::notify(osg::NOTICE)<<"starting thread context "<<_context<<std::endl;
}
~MyTest()
~ThreadExitTidyUp()
{
osg::notify(osg::NOTICE)<<"MyTest Constructor"<<std::endl;
osg::notify(osg::NOTICE)<<"exit thread"<<std::endl;
if (_context)
{
if (_closeContextOnExit)
{
osg::notify(osg::NOTICE)<<" - close context "<<_context<<std::endl;
_context->closeImplementation();
osg::notify(osg::NOTICE)<<" - done close context "<<_context<<std::endl;
}
else
{
osg::notify(osg::NOTICE)<<" - releaseContext "<<_context<<std::endl;
//_context->releaseContext();
}
}
}
osg::GraphicsContext* _context;
bool _closeContextOnExit;
};
@ -65,7 +88,7 @@ GraphicsThread::~GraphicsThread()
int GraphicsThread::cancel()
{
osg::notify(osg::INFO)<<"Cancelling graphics thread"<<std::endl;
osg::notify(osg::INFO)<<"Cancelling graphics thread "<<this<<std::endl;
int result = 0;
if( isRunning() )
@ -73,10 +96,26 @@ int GraphicsThread::cancel()
_done = true;
// cancel the thread..
// result = Thread::cancel();
//join();
osg::notify(osg::INFO)<<" Doing cancel "<<this<<std::endl;
for(OperationQueue::iterator itr = _operations.begin();
itr != _operations.end();
++itr)
{
BarrierOperation* barrier = dynamic_cast<BarrierOperation*>(itr->get());
if (barrier)
{
barrier->release();
//barrier->invalidate();
osg::notify(osg::INFO)<<" Invalidating barrier "<<this<<std::endl;
}
}
/*
// cancel the thread..
result = Thread::cancel();
//join();
*/
// release the frameBlock and _databasePagerThreadBlock incase its holding up thread cancelation.
_operationsBlock->release();
@ -85,7 +124,7 @@ int GraphicsThread::cancel()
{
// commenting out debug info as it was cashing crash on exit, presumable
// due to osg::notify or std::cout destructing earlier than this destructor.
osg::notify(osg::INFO)<<"Waiting for GraphicsThread to cancel"<<std::endl;
osg::notify(osg::INFO)<<" Waiting for GraphicsThread to cancel "<<this<<std::endl;
OpenThreads::Thread::YieldCurrentThread();
}
}
@ -124,21 +163,25 @@ void GraphicsThread::add(Operation* operation, bool waitForCompletion)
void GraphicsThread::run()
{
bool contextRealizedInThisThread = false;
// make the graphics context current.
if (_graphicsContext)
{
if (!_graphicsContext->isRealized())
{
_graphicsContext->realize();
contextRealizedInThisThread = true;
}
osg::notify(osg::INFO)<<"Doing make current"<<std::endl;
_graphicsContext->makeCurrent();
}
osg::notify(osg::INFO)<<"Doing run"<<std::endl;
// create a local object to clean up once the thread is cancelled.
ThreadExitTidyUp threadExitTypeUp(_graphicsContext, contextRealizedInThisThread);
MyTest test;
osg::notify(osg::INFO)<<"Doing run"<<std::endl;
bool firstTime = true;
@ -201,7 +244,7 @@ void GraphicsThread::run()
if (operation.valid())
{
osg::notify(osg::INFO)<<"Doing op "<<operation->getName()<<std::endl;
osg::notify(osg::INFO)<<"Doing op "<<operation->getName()<<" "<<this<<std::endl;
// call the graphics operation.
(*operation)(_graphicsContext);
@ -219,9 +262,6 @@ void GraphicsThread::run()
osg::notify(osg::NOTICE)<<"exit loop"<<std::endl;
// release the graphics context so that others can aquire it.
if (_graphicsContext) _graphicsContext->releaseContext();
}
void SwapBuffersOperation::operator () (GraphicsContext* context)

View File

@ -231,7 +231,8 @@ void GraphicsContextImplementation::closeImplementation()
{
if (!_rs) return;
// need to close render surface...
// close render surface by deleting it
_rs = 0;
}
void GraphicsContextImplementation::bindPBufferToTextureImplementation(GLenum buffer)