Crash prevention: throw during dtor
get_manager() will be called during dtor, so throwing an exception would cause a hard crash.
This commit is contained in:
@@ -175,9 +175,10 @@ SGSubsystemGroup* SGSubsystem::get_group() const
|
|||||||
|
|
||||||
SGSubsystemMgr* SGSubsystem::get_manager() const
|
SGSubsystemMgr* SGSubsystem::get_manager() const
|
||||||
{
|
{
|
||||||
if (!get_group())
|
if (auto group = get_group(); group)
|
||||||
throw sg_exception("SGSubsystem::get_manager: subsystem " + subsystemId() + " has no group");
|
return group->get_manager();
|
||||||
return get_group()->get_manager();
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string SGSubsystem::nameForState(State s)
|
std::string SGSubsystem::nameForState(State s)
|
||||||
@@ -695,8 +696,7 @@ SGSubsystemGroup::remove_subsystem(const string &name)
|
|||||||
void
|
void
|
||||||
SGSubsystemGroup::notifyWillChange(SGSubsystem* sub, SGSubsystemMgr::State s)
|
SGSubsystemGroup::notifyWillChange(SGSubsystem* sub, SGSubsystemMgr::State s)
|
||||||
{
|
{
|
||||||
auto manager = get_manager();
|
if (auto manager = get_manager(); manager) {
|
||||||
if (manager) {
|
|
||||||
manager->notifyDelegatesWillChange(sub, s);
|
manager->notifyDelegatesWillChange(sub, s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -704,8 +704,7 @@ SGSubsystemGroup::notifyWillChange(SGSubsystem* sub, SGSubsystemMgr::State s)
|
|||||||
void
|
void
|
||||||
SGSubsystemGroup::notifyDidChange(SGSubsystem* sub, SGSubsystemMgr::State s)
|
SGSubsystemGroup::notifyDidChange(SGSubsystem* sub, SGSubsystemMgr::State s)
|
||||||
{
|
{
|
||||||
auto manager = get_manager();
|
if (auto manager = get_manager(); manager) {
|
||||||
if (manager) {
|
|
||||||
manager->notifyDelegatesDidChange(sub, s);
|
manager->notifyDelegatesDidChange(sub, s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -761,8 +760,7 @@ auto SGSubsystemGroup::get_member(const string &name, bool create) -> Member*
|
|||||||
|
|
||||||
SGSubsystemMgr* SGSubsystemGroup::get_manager() const
|
SGSubsystemMgr* SGSubsystemGroup::get_manager() const
|
||||||
{
|
{
|
||||||
auto parentGroup = get_group();
|
if (auto parentGroup = get_group(); parentGroup) {
|
||||||
if (parentGroup) {
|
|
||||||
return parentGroup->get_manager();
|
return parentGroup->get_manager();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user