]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/globals.cxx
Reset, fix Nasal timers added on shutdown.
[flightgear.git] / src / Main / globals.cxx
index 9c714f6cb266c2548a989ea0f79b87f371eebf9e..3f469d05a2df3476a6888345bd555287750fd258 100644 (file)
@@ -212,10 +212,22 @@ FGGlobals::~FGGlobals()
     subsystem_mgr->remove("model-manager");
     _tile_mgr.clear();
 
+    osg::ref_ptr<osgViewer::Viewer> 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.
-    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
@@ -224,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);
@@ -531,6 +544,18 @@ static void treeDumpRefCounts(int depth, SGPropertyNode* nd)
     }
 }
 
+static void treeClearAliases(SGPropertyNode* nd)
+{
+    if (nd->isAlias()) {
+        nd->unalias();
+    }
+    
+    for (int i=0; i<nd->nChildren(); ++i) {
+        SGPropertyNode* cp = nd->getChild(i);
+        treeClearAliases(cp);
+    }
+}
+
 void
 FGGlobals::resetPropertyRoot()
 {
@@ -551,6 +576,9 @@ FGGlobals::resetPropertyRoot()
     orientHeading.clear();
     orientRoll.clear();
     
+    // clear aliases so ref-counts are accurate when dumped
+    treeClearAliases(props);
+    
     SG_LOG(SG_GENERAL, SG_INFO, "root props refcount:" << props.getNumRefs());
     treeDumpRefCounts(0, props);