From: James Turner Date: Sat, 4 Jan 2014 16:10:42 +0000 (+0000) Subject: #1291, hang on exit with OSG threading. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=9e773e85f865d42abb8027b515292db4af82876a;p=flightgear.git #1291, hang on exit with OSG threading. Explicitly stop threading during shutdown, before destroying various rendering / viewer related structures. --- diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index fb3a35480..f1f8bd1e5 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -212,12 +212,22 @@ FGGlobals::~FGGlobals() subsystem_mgr->remove("model-manager"); _tile_mgr.clear(); + osg::ref_ptr vw(renderer->getViewer()); + if (vw) { + // https://code.google.com/p/flightgear-bugs/issues/detail?id=1291 + // explicitly stop trheading before we delete the renderer or + // viewMgr (which ultimately holds refs to the CameraGroup, and + // GraphicsContext) + vw->stopThreading(); + } + // don't cancel the pager until after shutdown, since AIModels (and // potentially others) can queue delete requests on the pager. - if (renderer->getViewer() && renderer->getViewer()->getDatabasePager()) { - renderer->getViewer()->getDatabasePager()->cancel(); - renderer->getViewer()->getDatabasePager()->clear(); + if (vw && vw->getDatabasePager()) { + vw->getDatabasePager()->cancel(); + vw->getDatabasePager()->clear(); } + osgDB::Registry::instance()->clearObjectCache(); // renderer touches subsystems during its destruction @@ -226,7 +236,8 @@ FGGlobals::~FGGlobals() _chatter_queue.clear(); delete subsystem_mgr; - subsystem_mgr = NULL; // important so ::get_subsystem returns NULL + subsystem_mgr = NULL; // important so ::get_subsystem returns NULL + vw = 0; // don't delete the viewer until now delete time_params; set_matlib(NULL);