]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/globals.cxx
Pull Ephemeris out of FGGlobals
[flightgear.git] / src / Main / globals.cxx
index eedfd21bcb8e7587f244d8c97f2565d472452603..ff86ee15bd9779626fc94876bb830327b3afdad4 100644 (file)
@@ -157,8 +157,6 @@ FGGlobals::FGGlobals() :
     fg_root( "" ),
     fg_home( "" ),
     time_params( NULL ),
-    ephem( NULL ),
-    viewmgr( NULL ),
     commands( SGCommandMgr::instance() ),
     channel_options_list( NULL ),
     initial_waypoints( NULL ),
@@ -200,26 +198,8 @@ FGGlobals::~FGGlobals()
     // save user settings (unless already saved)
     saveUserSettings();
 
-    // The AIModels manager performs a number of actions upon
-    // Shutdown that implicitly assume that other subsystems
-    // are still operational (Due to the dynamic allocation and
-    // deallocation of AIModel objects. To ensure we can safely
-    // shut down all subsystems, make sure we take down the
-    // AIModels system first.
-    SGSubsystemRef ai = subsystem_mgr->get_subsystem("ai-model");
-    if (ai) {
-        subsystem_mgr->remove("ai-model");
-        ai->unbind();
-        ai.clear(); // ensure AI is deleted now, not at end of this method
-    }
-
-    subsystem_mgr->shutdown();
-    subsystem_mgr->unbind();
-
-    subsystem_mgr->remove("aircraft-model");
-    subsystem_mgr->remove("tile-manager");
-    subsystem_mgr->remove("model-manager");
-    _tile_mgr.clear();
+    // stop OSG threading first, to avoid thread races while we tear down
+    // scene-graph pieces
 
     osg::ref_ptr<osgViewer::Viewer> vw(renderer->getViewer());
     if (vw) {
@@ -230,6 +210,10 @@ FGGlobals::~FGGlobals()
         vw->stopThreading();
     }
 
+    subsystem_mgr->shutdown();
+    subsystem_mgr->unbind();
+
+    subsystem_mgr->remove(FGTileMgr::subsystemName());
     // don't cancel the pager until after shutdown, since AIModels (and
     // potentially others) can queue delete requests on the pager.
     if (vw && vw->getDatabasePager()) {
@@ -238,10 +222,10 @@ FGGlobals::~FGGlobals()
     }
 
     osgDB::Registry::instance()->clearObjectCache();
+    subsystem_mgr->remove(FGScenery::subsystemName());
 
     // renderer touches subsystems during its destruction
     set_renderer(NULL);
-    _scenery.clear();
     _chatter_queue.clear();
 
     delete subsystem_mgr;
@@ -694,12 +678,6 @@ FGGlobals::saveUserSettings()
     }
 }
 
-FGViewer *
-FGGlobals::get_current_view () const
-{
-  return viewmgr->get_current_view();
-}
-
 long int FGGlobals::get_warp() const
 {
   return fgGetInt("/sim/time/warp");
@@ -722,22 +700,23 @@ void FGGlobals::set_warp_delta( long int d )
 
 FGScenery* FGGlobals::get_scenery () const
 {
-    return _scenery.get();
+    return get_subsystem<FGScenery>();
 }
 
-void FGGlobals::set_scenery ( FGScenery *s )
+FGTileMgr* FGGlobals::get_tile_mgr () const
 {
-    _scenery = s;
+    return get_subsystem<FGTileMgr>();
 }
 
-FGTileMgr* FGGlobals::get_tile_mgr () const
+FGViewMgr *FGGlobals::get_viewmgr() const
 {
-    return _tile_mgr.get();
+    return get_subsystem<FGViewMgr>();
 }
 
-void FGGlobals::set_tile_mgr ( FGTileMgr *t )
+FGViewer* FGGlobals::get_current_view () const
 {
-    _tile_mgr = t;
+    FGViewMgr* vm = get_viewmgr();
+    return vm ? vm->get_current_view() : 0;
 }
 
 void FGGlobals::set_matlib( SGMaterialLib *m )