Make subsystem group destruction explicit, so get_subsystem calls during destruction are safe.
This commit is contained in:
@@ -383,6 +383,9 @@ void SGSubsystemGroup::Member::updateExecutionTime(double time)
|
|||||||
|
|
||||||
SGSubsystemMgr::SGSubsystemMgr ()
|
SGSubsystemMgr::SGSubsystemMgr ()
|
||||||
{
|
{
|
||||||
|
for (int i = 0; i < MAX_GROUPS; i++) {
|
||||||
|
_groups[i] = new SGSubsystemGroup;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SGSubsystemMgr::~SGSubsystemMgr ()
|
SGSubsystemMgr::~SGSubsystemMgr ()
|
||||||
@@ -390,34 +393,38 @@ SGSubsystemMgr::~SGSubsystemMgr ()
|
|||||||
// ensure get_subsystem returns NULL from now onwards,
|
// ensure get_subsystem returns NULL from now onwards,
|
||||||
// before the SGSubsystemGroup destructors are run
|
// before the SGSubsystemGroup destructors are run
|
||||||
_subsystem_map.clear();
|
_subsystem_map.clear();
|
||||||
|
|
||||||
|
for (int i = 0; i < MAX_GROUPS; i++) {
|
||||||
|
delete _groups[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SGSubsystemMgr::init ()
|
SGSubsystemMgr::init ()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_GROUPS; i++)
|
for (int i = 0; i < MAX_GROUPS; i++)
|
||||||
_groups[i].init();
|
_groups[i]->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SGSubsystemMgr::postinit ()
|
SGSubsystemMgr::postinit ()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_GROUPS; i++)
|
for (int i = 0; i < MAX_GROUPS; i++)
|
||||||
_groups[i].postinit();
|
_groups[i]->postinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SGSubsystemMgr::reinit ()
|
SGSubsystemMgr::reinit ()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_GROUPS; i++)
|
for (int i = 0; i < MAX_GROUPS; i++)
|
||||||
_groups[i].reinit();
|
_groups[i]->reinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SGSubsystemMgr::bind ()
|
SGSubsystemMgr::bind ()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_GROUPS; i++)
|
for (int i = 0; i < MAX_GROUPS; i++)
|
||||||
_groups[i].bind();
|
_groups[i]->bind();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -425,14 +432,14 @@ SGSubsystemMgr::unbind ()
|
|||||||
{
|
{
|
||||||
// reverse order to prevent order dependency problems
|
// reverse order to prevent order dependency problems
|
||||||
for (int i = MAX_GROUPS-1; i >= 0; i--)
|
for (int i = MAX_GROUPS-1; i >= 0; i--)
|
||||||
_groups[i].unbind();
|
_groups[i]->unbind();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SGSubsystemMgr::update (double delta_time_sec)
|
SGSubsystemMgr::update (double delta_time_sec)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_GROUPS; i++) {
|
for (int i = 0; i < MAX_GROUPS; i++) {
|
||||||
_groups[i].update(delta_time_sec);
|
_groups[i]->update(delta_time_sec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,7 +447,7 @@ void
|
|||||||
SGSubsystemMgr::collectDebugTiming(bool collect)
|
SGSubsystemMgr::collectDebugTiming(bool collect)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_GROUPS; i++) {
|
for (int i = 0; i < MAX_GROUPS; i++) {
|
||||||
_groups[i].collectDebugTiming(collect);
|
_groups[i]->collectDebugTiming(collect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -448,14 +455,14 @@ void
|
|||||||
SGSubsystemMgr::suspend ()
|
SGSubsystemMgr::suspend ()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_GROUPS; i++)
|
for (int i = 0; i < MAX_GROUPS; i++)
|
||||||
_groups[i].suspend();
|
_groups[i]->suspend();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SGSubsystemMgr::resume ()
|
SGSubsystemMgr::resume ()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < MAX_GROUPS; i++)
|
for (int i = 0; i < MAX_GROUPS; i++)
|
||||||
_groups[i].resume();
|
_groups[i]->resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
@@ -491,8 +498,8 @@ SGSubsystemMgr::remove(const char* name)
|
|||||||
|
|
||||||
// tedious part - we don't know which group the subsystem belongs too
|
// tedious part - we don't know which group the subsystem belongs too
|
||||||
for (int i = 0; i < MAX_GROUPS; i++) {
|
for (int i = 0; i < MAX_GROUPS; i++) {
|
||||||
if (_groups[i].get_subsystem(name) == sub) {
|
if (_groups[i]->get_subsystem(name) == sub) {
|
||||||
_groups[i].remove_subsystem(name);
|
_groups[i]->remove_subsystem(name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} // of groups iteration
|
} // of groups iteration
|
||||||
@@ -504,7 +511,7 @@ SGSubsystemMgr::remove(const char* name)
|
|||||||
SGSubsystemGroup *
|
SGSubsystemGroup *
|
||||||
SGSubsystemMgr::get_group (GroupType group)
|
SGSubsystemMgr::get_group (GroupType group)
|
||||||
{
|
{
|
||||||
return &(_groups[group]);
|
return _groups[group];
|
||||||
}
|
}
|
||||||
|
|
||||||
SGSubsystem *
|
SGSubsystem *
|
||||||
|
|||||||
@@ -418,7 +418,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
SGSubsystemGroup _groups[MAX_GROUPS];
|
SGSubsystemGroup* _groups[MAX_GROUPS];
|
||||||
|
|
||||||
typedef std::map<std::string, SGSubsystem*> SubsystemDict;
|
typedef std::map<std::string, SGSubsystem*> SubsystemDict;
|
||||||
SubsystemDict _subsystem_map;
|
SubsystemDict _subsystem_map;
|
||||||
|
|||||||
Reference in New Issue
Block a user