]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/globals.cxx
Make PerformanceDB a real subsystem
[flightgear.git] / src / Main / globals.cxx
index d1ec0b47cd8d51a9a9d7d4ab16e720f709dfdf6e..084d77128ae73cb6b86f92532c36b34c67f7e5fe 100644 (file)
@@ -50,7 +50,6 @@
 #include <Autopilot/route_mgr.hxx>
 #include <GUI/FGFontCache.hxx>
 #include <GUI/gui.h>
-#include <MultiPlayer/multiplaymgr.hxx>
 #include <Scenery/scenery.hxx>
 #include <Scenery/tilemgr.hxx>
 #include <Navaids/navlist.hxx>
@@ -159,9 +158,6 @@ FGGlobals::FGGlobals() :
     fg_home( "" ),
     time_params( NULL ),
     ephem( NULL ),
-    route_mgr( NULL ),
-    controls( NULL ),
-    viewmgr( NULL ),
     commands( SGCommandMgr::instance() ),
     channel_options_list( NULL ),
     initial_waypoints( NULL ),
@@ -203,6 +199,19 @@ FGGlobals::~FGGlobals()
     // save user settings (unless already saved)
     saveUserSettings();
 
+    // 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) {
+        // 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();
+    }
+
+#if 0
     // 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
@@ -215,24 +224,12 @@ FGGlobals::~FGGlobals()
         ai->unbind();
         ai.clear(); // ensure AI is deleted now, not at end of this method
     }
+#endif
 
     subsystem_mgr->shutdown();
     subsystem_mgr->unbind();
 
-    subsystem_mgr->remove("aircraft-model");
-    subsystem_mgr->remove("tile-manager");
-    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();
-    }
-
+    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()) {
@@ -241,10 +238,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;
@@ -253,7 +250,7 @@ FGGlobals::~FGGlobals()
 
     delete time_params;
     set_matlib(NULL);
-    delete route_mgr;
+
     delete channel_options_list;
     delete initial_waypoints;
     delete fontcache;
@@ -509,7 +506,7 @@ FGGlobals::get_subsystem_mgr () const
 }
 
 SGSubsystem *
-FGGlobals::get_subsystem (const char * name)
+FGGlobals::get_subsystem (const char * name) const
 {
     if (!subsystem_mgr) {
         return NULL;
@@ -530,10 +527,7 @@ FGGlobals::add_subsystem (const char * name,
 SGSoundMgr *
 FGGlobals::get_soundmgr () const
 {
-    if (subsystem_mgr)
-        return (SGSoundMgr*) subsystem_mgr->get_subsystem("sound");
-
-    return NULL;
+    return get_subsystem<SGSoundMgr>();
 }
 
 SGEventMgr *
@@ -700,12 +694,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");
@@ -728,22 +716,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 )
@@ -751,6 +740,11 @@ void FGGlobals::set_matlib( SGMaterialLib *m )
     matlib = m;
 }
 
+FGControls *FGGlobals::get_controls() const
+{
+    return get_subsystem<FGControls>();
+}
+
 FGSampleQueue* FGGlobals::get_chatter_queue() const
 {
     return _chatter_queue;