X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fsubsystem_mgr.cxx;h=387d097a091bd855ebfe189aeb38b092135ded59;hb=c955e61ba785a7b4699ed0a35f947fb661cab854;hp=9488faea51a06c1b2c58d624adc4f11f6a5c60c7;hpb=6a07c2282673562f67d12d31cd618be85d80f45a;p=simgear.git diff --git a/simgear/structure/subsystem_mgr.cxx b/simgear/structure/subsystem_mgr.cxx index 9488faea..387d097a 100644 --- a/simgear/structure/subsystem_mgr.cxx +++ b/simgear/structure/subsystem_mgr.cxx @@ -38,6 +38,11 @@ SGSubsystem::reinit () { } +void +SGSubsystem::shutdown () +{ +} + void SGSubsystem::bind () { @@ -141,6 +146,14 @@ SGSubsystemGroup::reinit () _members[i]->subsystem->reinit(); } +void +SGSubsystemGroup::shutdown () +{ + // reverse order to prevent order dependency problems + for (unsigned int i = _members.size(); i > 0; i--) + _members[i-1]->subsystem->shutdown(); +} + void SGSubsystemGroup::bind () { @@ -383,38 +396,57 @@ void SGSubsystemGroup::Member::updateExecutionTime(double time) SGSubsystemMgr::SGSubsystemMgr () { + for (int i = 0; i < MAX_GROUPS; i++) { + _groups[i] = new SGSubsystemGroup; + } } SGSubsystemMgr::~SGSubsystemMgr () { + // ensure get_subsystem returns NULL from now onwards, + // before the SGSubsystemGroup destructors are run + _subsystem_map.clear(); + + for (int i = 0; i < MAX_GROUPS; i++) { + delete _groups[i]; + } } void SGSubsystemMgr::init () { for (int i = 0; i < MAX_GROUPS; i++) - _groups[i].init(); + _groups[i]->init(); } void SGSubsystemMgr::postinit () { for (int i = 0; i < MAX_GROUPS; i++) - _groups[i].postinit(); + _groups[i]->postinit(); } void SGSubsystemMgr::reinit () { for (int i = 0; i < MAX_GROUPS; i++) - _groups[i].reinit(); + _groups[i]->reinit(); } +void +SGSubsystemMgr::shutdown () +{ + // reverse order to prevent order dependency problems + for (int i = MAX_GROUPS-1; i >= 0; i--) + _groups[i]->shutdown(); +} + + void SGSubsystemMgr::bind () { for (int i = 0; i < MAX_GROUPS; i++) - _groups[i].bind(); + _groups[i]->bind(); } void @@ -422,14 +454,14 @@ SGSubsystemMgr::unbind () { // reverse order to prevent order dependency problems for (int i = MAX_GROUPS-1; i >= 0; i--) - _groups[i].unbind(); + _groups[i]->unbind(); } void SGSubsystemMgr::update (double delta_time_sec) { for (int i = 0; i < MAX_GROUPS; i++) { - _groups[i].update(delta_time_sec); + _groups[i]->update(delta_time_sec); } } @@ -437,7 +469,7 @@ void SGSubsystemMgr::collectDebugTiming(bool collect) { for (int i = 0; i < MAX_GROUPS; i++) { - _groups[i].collectDebugTiming(collect); + _groups[i]->collectDebugTiming(collect); } } @@ -445,14 +477,14 @@ void SGSubsystemMgr::suspend () { for (int i = 0; i < MAX_GROUPS; i++) - _groups[i].suspend(); + _groups[i]->suspend(); } void SGSubsystemMgr::resume () { for (int i = 0; i < MAX_GROUPS; i++) - _groups[i].resume(); + _groups[i]->resume(); } bool @@ -475,16 +507,39 @@ SGSubsystemMgr::add (const char * name, SGSubsystem * subsystem, _subsystem_map[name] = subsystem; } +SGSubsystem* +SGSubsystemMgr::remove(const char* name) +{ + SubsystemDict::iterator s =_subsystem_map.find(name); + if (s == _subsystem_map.end()) { + return NULL; + } + + SGSubsystem* sub = s->second; + _subsystem_map.erase(s); + +// tedious part - we don't know which group the subsystem belongs too + for (int i = 0; i < MAX_GROUPS; i++) { + if (_groups[i]->get_subsystem(name) == sub) { + _groups[i]->remove_subsystem(name); + break; + } + } // of groups iteration + + return sub; +} + + SGSubsystemGroup * SGSubsystemMgr::get_group (GroupType group) { - return &(_groups[group]); + return _groups[group]; } SGSubsystem * -SGSubsystemMgr::get_subsystem (const string &name) +SGSubsystemMgr::get_subsystem (const string &name) const { - map::iterator s =_subsystem_map.find(name); + SubsystemDict::const_iterator s =_subsystem_map.find(name); if (s == _subsystem_map.end()) return 0;