#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>
fg_root( "" ),
fg_home( "" ),
time_params( NULL ),
- ephem( NULL ),
- route_mgr( NULL ),
- controls( NULL ),
- viewmgr( NULL ),
commands( SGCommandMgr::instance() ),
channel_options_list( NULL ),
initial_waypoints( NULL ),
// 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) {
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()) {
}
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;
delete time_params;
set_matlib(NULL);
- delete route_mgr;
+
delete channel_options_list;
delete initial_waypoints;
delete fontcache;
}
SGSubsystem *
-FGGlobals::get_subsystem (const char * name)
+FGGlobals::get_subsystem (const char * name) const
{
if (!subsystem_mgr) {
return NULL;
SGSoundMgr *
FGGlobals::get_soundmgr () const
{
- if (subsystem_mgr)
- return (SGSoundMgr*) subsystem_mgr->get_subsystem("sound");
-
- return NULL;
+ return get_subsystem<SGSoundMgr>();
}
SGEventMgr *
}
}
-FGViewer *
-FGGlobals::get_current_view () const
-{
- return viewmgr->get_current_view();
-}
-
long int FGGlobals::get_warp() const
{
return fgGetInt("/sim/time/warp");
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 )
matlib = m;
}
+FGControls *FGGlobals::get_controls() const
+{
+ return get_subsystem<FGControls>();
+}
+
FGSampleQueue* FGGlobals::get_chatter_queue() const
{
return _chatter_queue;